openapi: 3.2.0 info: title: AI Discovery Site Audit — AEO/GEO Fix Pack | agent402.dev… version: 1.7.0 description: 'Primary product: five fixed remediation slots for JSON-LD, metadata, robots.txt, llms.txt, and sitemap.xml. Copy-paste code is included only when observed evidence permits; otherwise the slot reports an explicit review, none, or needs-input action. Includes a $5, 22-check technical SEO/AEO/GEO audit and seven fixed agent-discovery findings for one public HTTPS page with at least one public IPv4 DNS answer. Existing auxiliary x402 tools remain available on their documented paths.' x-guidance: 'Use siteReleaseAudit for the primary $5 AI Discovery Site Audit. First POST the exact body to the free /site-release-audit/eligibility support route; it checks bounded main-document delivery but returns no score, findings, root observations, or remediations. Then submit the unchanged body promptly with an x402-capable buyer client that validates the exact v2 Base-USDC terms and supplies PAYMENT-SIGNATURE. Plain curl is only a 402 probe: it inspects the challenge, is not checkout, and does not pay. Direct x402 cancels settlement on a 4xx/5xx report response; Payan challenges before seller input validation and wrong input can still settle. Inspect GET /site-release-audit/sample.json and GET /site-release-audit/methodology.json for the current v1.1 contract. GET /site-release-audit/proof/v1/case-study.json is the immutable seller-controlled base proof; it predates and does not prove root-file observation.' contact: name: AI Discovery Site Audit url: https://agent402.dev/site-release-audit servers: - url: https://agent402.dev tags: - name: Developer tools paths: /website-preflight: post: operationId: websitePreflight summary: Preflight one public website with seven HEAD-only checks description: Returns a bounded public-HTTPS, public-IPv4-pinned HTTP, redirect, HSTS, CSP, nosniff, and frame-policy snapshot without downloading a response body. tags: - Developer tools x-payment-info: price: mode: fixed currency: USD amount: '0.05' protocols: - x402: {} x-price: $0.05 requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/PublicUrlInput' responses: '200': description: Verified URL Evidence Snapshot content: application/json: schema: $ref: '#/components/schemas/UrlPreflightReport' '400': description: Invalid or unsafe public target '402': description: Payment Required. An x402-capable buyer client must validate the challenge and retry once with PAYMENT-SIGNATURE; plain curl only obtains this 402 and does not pay. '502': description: Bounded target observation failed /url-evidence: get: operationId: verifiedUrlEvidence summary: Capture bounded HTTP, TLS, and SHA-256 evidence for $1 description: Returns one credential-free public HTTPS observation pinned to a public IPv4 address. The url query defaults to https://example.com/ so automated clients receive a valid delivery; buyers can supply another public HTTPS URL with at least one public IPv4 DNS answer. content_fingerprint defaults to true and hashes at most 128 KiB without retaining or returning response content. The encoded request-target is capped at 2300 bytes and its JSON string serialization at 2302 bytes. Delivery runs after payment verification but before settlement, so invalid or unavailable targets fail without charging. tags: - Developer tools x-payment-info: price: mode: fixed currency: USD amount: '1.00' protocols: - x402: {} x-price: $1.00 x-request-target-max-bytes: 2300 x-request-target-max-json-bytes: 2302 parameters: - name: url in: query required: false description: Credential-free public HTTPS URL. The complete encoded request-target must not exceed 2300 bytes or 2302 bytes as a JSON string. schema: type: string format: uri pattern: ^https:// maxLength: 2048 default: https://example.com/ - name: content_fingerprint in: query required: false description: Hash up to 128 KiB of the response representation. schema: type: boolean default: true responses: '200': description: Verified URL Evidence Snapshot headers: X-Evidence-ID: description: Stable 24-hex identifier for this point-in-time observation. schema: type: string pattern: ^[a-f0-9]{24}$ X-Report-SHA256: description: SHA-256 of the JSON report before reportSha256 is appended. schema: type: string pattern: ^[a-f0-9]{64}$ content: application/json: schema: $ref: '#/components/schemas/UrlEvidenceReport' '400': description: Invalid or unsafe public target; payment does not settle '402': description: Payment Required. An x402-capable buyer client must validate the challenge and retry once with PAYMENT-SIGNATURE; plain curl only obtains this 402 and does not pay. '502': description: Bounded target observation failed; payment does not settle /site-release-audit: post: operationId: siteReleaseAudit summary: AI Discovery Site Audit — AEO/GEO Fix Pack for one public URL description: Returns 22 bounded transport, security-header, SEO, accessibility-surface, AEO, and GEO checks, seven fixed agent-discovery findings, and five fixed remediation slots for JSON-LD, metadata, robots.txt, llms.txt, and sitemap.xml. The target must have at least one public IPv4 DNS answer; every connection is pinned to a validated public IPv4 address. A slot includes copy-paste code only when observed evidence permits; otherwise its action is review, none, or needs-input. Root requests are parallel, redirect-free, size-capped, and nonfatal. Payment requires an x402-capable client and PAYMENT-SIGNATURE; plain curl only obtains the HTTP 402 challenge and does not pay. tags: - Developer tools x-payment-info: price: mode: fixed currency: USD amount: '5.00' protocols: - x402: {} x-price: $5.00 x-payment-client-guidance: required: true protocolVersion: 2 requestHeader: PAYMENT-SIGNATURE plainCurlBehavior: HTTP 402 probe only; not checkout; no payment. requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/PublicUrlInput' responses: '200': description: Website Release Evidence Dossier content: application/json: schema: $ref: '#/components/schemas/WebsiteEvidenceReport' '400': description: Invalid or unsafe public target '402': description: Payment Required. An x402-capable buyer client must validate the challenge and retry once with PAYMENT-SIGNATURE; plain curl only obtains this 402 and does not pay. '502': description: Bounded target observation failed /site-release-audit/eligibility: post: operationId: siteReleaseAuditEligibility summary: Check main-document delivery eligibility before paying description: Free point-in-time support check for the exact paid body. It reuses the paid audit main-document DNS, TLS, IP-pinning, redirect, body-cap, and deadline path; makes zero root-file requests; and returns no audit score, findings, or remediations. It is not an outcome or ranking guarantee. Payan can settle wrong input, so submit the unchanged checked body promptly. tags: - Developer tools requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/PublicUrlInput' responses: '200': description: Main-document delivery was eligible at the stated time content: application/json: schema: $ref: '#/components/schemas/SiteAuditEligibility' '422': description: Exact input or target is ineligible content: application/json: schema: $ref: '#/components/schemas/SiteAuditEligibility' '429': description: Ephemeral client or target rate limit reached headers: Retry-After: schema: type: integer const: 60 content: application/json: schema: $ref: '#/components/schemas/SiteAuditEligibility' '503': description: Transport eligibility is unknown or local probe capacity is full content: application/json: schema: $ref: '#/components/schemas/SiteAuditEligibility' /site-release-audit/sample.json: get: operationId: siteReleaseAuditSample summary: Inspect a full production-format audit sample for example.com description: Free fixed-target proof of the exact paid response contract. It contains all 22 checks, seven discovery findings, five fixed remediation slots with conditional code and explicit actions, and integrity checksums; it cannot audit caller-selected URLs. tags: - Developer tools responses: '200': description: Full production-format Website Release Evidence Dossier sample content: application/json: schema: $ref: '#/components/schemas/WebsiteEvidenceReport' '502': description: The fixed public sample target could not be refreshed /site-release-audit/methodology.json: get: operationId: siteReleaseAuditMethodology summary: Inspect the live fixed audit method and fail-closed rules description: Free machine-readable check weights, AEO/GEO finding IDs, remediation slots, observation limits, fail-closed predicates, and exact integrity semantics for the paid audit. tags: - Developer tools responses: '200': description: Live production methodology content: application/json: schema: type: object additionalProperties: true '502': description: The live methodology could not be assembled /site-release-audit/proof/v1/case-study.json: get: operationId: siteReleaseAuditCaseStudy summary: Verify one frozen v1 base 22-check before/after audit case description: 'Free, immutable seller-controlled v1 deterministic replay: complete frozen HTTP representations, both full 22-check reports, all 22/7/5 deltas, a root-replacement patch, integrity hashes, and explicit limitations. It predates and does not prove the v1.1 root-file observations shown by the live sample and methodology. It is not a paid customer result or an independent attestation.' tags: - Developer tools responses: '200': description: Reproducible Website Release Evidence Dossier case study content: application/json: schema: $ref: '#/components/schemas/SiteAuditCaseStudy' /audit-x402: post: operationId: auditX402 summary: Audit one public x402 v2 GET endpoint description: Checks a public-IPv4-pinned endpoint for payment binding, Base USDC terms, Bazaar metadata, protected-body leakage, and launch readiness. tags: - Developer tools x-payment-info: price: mode: fixed currency: USD amount: '5.99' protocols: - x402: {} x-price: $5.99 requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/X402AuditInput' responses: '200': description: x402 launch-readiness report content: application/json: schema: $ref: '#/components/schemas/X402AuditReport' '400': description: Invalid or unsafe public target '402': description: Payment Required. An x402-capable buyer client must validate the challenge and retry once with PAYMENT-SIGNATURE; plain curl only obtains this 402 and does not pay. '502': description: Bounded target observation failed /x402-health: post: operationId: x402Health summary: Check one public x402 GET endpoint for $0.01 description: Returns bounded challenge, resource-binding, canonical Base USDC, and Bazaar health facts for a public-IPv4-pinned endpoint without paying the target or exposing the full remediation dossier. tags: - Developer tools x-payment-info: price: mode: fixed currency: USD amount: '0.01' protocols: - x402: {} x-price: $0.01 requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/X402AuditInput' responses: '200': description: x402 endpoint health snapshot content: application/json: schema: $ref: '#/components/schemas/X402HealthReport' '400': description: Invalid or unsafe public target '402': description: Payment Required. An x402-capable buyer client must validate the challenge and retry once with PAYMENT-SIGNATURE; plain curl only obtains this 402 and does not pay. '502': description: Bounded target observation failed components: schemas: UrlEvidenceReport: type: object additionalProperties: false required: - product - version - observedAt - target - http - tls - summary - checks - scope - evidenceId - reportSha256 properties: product: type: string const: Verified URL Evidence Snapshot version: type: string const: 1.1.0 observedAt: type: string format: date-time target: type: object additionalProperties: false required: - url - method properties: url: type: string pattern: ^https:// method: type: string enum: - HEAD - GET http: type: object required: - status - durationMs - headers additionalProperties: true tls: type: - object - 'null' additionalProperties: true contentEvidence: type: object additionalProperties: false required: - algorithm - limitBytes - sampleBytes - sampleSha256 - complete - representationEncoding properties: algorithm: type: string const: sha256 limitBytes: type: integer const: 131072 sampleBytes: type: integer minimum: 0 maximum: 131072 sampleSha256: type: string pattern: ^[a-f0-9]{64}$ complete: type: boolean representationEncoding: type: - string - 'null' summary: type: object required: - passes - warnings - failures properties: passes: type: integer minimum: 0 warnings: type: integer minimum: 0 failures: type: integer minimum: 0 checks: type: array minItems: 7 maxItems: 8 items: type: object additionalProperties: false required: - id - status - message properties: id: type: string enum: - public-https - http-response - direct-url - content-fingerprint - hsts - content-security-policy - nosniff - frame-policy status: type: string enum: - pass - warning - fail message: type: string scope: type: string evidenceId: type: string pattern: ^[a-f0-9]{24}$ reportSha256: type: string pattern: ^[a-f0-9]{64}$ UrlPreflightCheck: type: object additionalProperties: false required: - id - status - message properties: id: type: string enum: - public-https - http-response - direct-url - hsts - content-security-policy - nosniff - frame-policy status: type: string enum: - pass - warning - fail message: type: string WebsiteAuditCheck: type: object additionalProperties: false required: - id - section - title - status - points - earned - evidence - fix properties: id: type: string section: type: string enum: - transport - security - seo - accessibility title: type: string status: type: string enum: - pass - warning - fail points: type: number earned: type: number evidence: type: object additionalProperties: true fix: type: - string - 'null' description: Prioritized copy-ready remediation when the check does not pass. PublicUrlInput: type: object additionalProperties: false required: - url properties: url: type: string format: uri pattern: ^https:// maxLength: 2048 description: Public HTTPS URL with at least one public IPv4 DNS answer. X402AuditCheck: type: object additionalProperties: false required: - id - status - message properties: id: type: string enum: - http-402 - protocol-v2 - payment-options - payment-fields - base-usdc - resource-binding - bazaar-discovery - protected-body status: type: string enum: - pass - warning - fail message: type: string description: Observed payment, discovery, or protected-body evidence. remediation: type: string description: Actionable fix when the check does not pass. X402AuditReport: type: object required: - product - version - auditId - auditedAt - target - summary - payment - checks - clientSnippets - disclaimer - reportSha256 properties: product: type: string const: x402 Launch Readiness Audit version: type: string const: 1.0.0 auditId: type: string pattern: ^[a-f0-9]{24}$ auditedAt: type: string format: date-time target: type: object additionalProperties: true summary: type: object required: - score - ready - passes - warnings - failures properties: score: type: integer minimum: 0 maximum: 100 ready: type: boolean passes: type: integer minimum: 0 warnings: type: integer minimum: 0 failures: type: integer minimum: 0 payment: type: - object - 'null' additionalProperties: true checks: type: array minItems: 8 maxItems: 8 items: $ref: '#/components/schemas/X402AuditCheck' clientSnippets: type: object additionalProperties: true disclaimer: type: string reportSha256: type: string pattern: ^[a-f0-9]{64}$ UrlPreflightReport: type: object required: - product - version - observedAt - target - http - tls - summary - checks - scope - evidenceId - reportSha256 properties: product: type: string const: Verified URL Evidence Snapshot version: type: string const: 1.1.0 observedAt: type: string format: date-time target: type: object required: - url - method properties: url: type: string format: uri method: type: string const: HEAD http: type: object additionalProperties: true tls: type: - object - 'null' additionalProperties: true summary: type: object required: - passes - warnings - failures properties: passes: type: integer minimum: 0 warnings: type: integer minimum: 0 failures: type: integer minimum: 0 checks: type: array minItems: 7 maxItems: 7 items: $ref: '#/components/schemas/UrlPreflightCheck' scope: type: string evidenceId: type: string pattern: ^[a-f0-9]{24}$ reportSha256: type: string pattern: ^[a-f0-9]{64}$ X402AuditInput: type: object additionalProperties: false required: - url properties: url: type: string format: uri pattern: ^https:// maxLength: 2048 description: Public HTTPS endpoint with at least one public IPv4 DNS answer. method: type: string enum: - GET default: GET SiteAuditCaseStudy: type: object additionalProperties: true required: - schemaVersion - caseStudyId - evidenceKind - livePaidRouteUsed - selfAuditBlocked - sourceRepresentations - patch - reports - delta - caveats - integrity properties: schemaVersion: type: string const: 1.0.0 caseStudyId: type: string pattern: ^[a-f0-9]{24}$ evidenceKind: type: string const: seller-controlled-deterministic-replay livePaidRouteUsed: type: boolean const: false selfAuditBlocked: type: boolean const: true sourceRepresentations: type: object required: - before - after additionalProperties: true patch: type: object additionalProperties: true reports: type: object required: - before - after additionalProperties: true delta: type: object additionalProperties: true caveats: type: array minItems: 1 items: type: string integrity: type: object additionalProperties: true SiteAuditEligibility: type: object additionalProperties: false required: - schemaVersion - product - checkKind - checkedAt - validUntil - eligibility - reason - inputSha256 - observation - purchaseBinding properties: schemaVersion: type: string const: 1.0.0 product: type: string const: AI Discovery Site Audit — AEO/GEO Fix Pack checkKind: type: string const: pre-payment-delivery-eligibility checkedAt: type: string format: date-time validUntil: type: string format: date-time eligibility: type: string enum: - eligible - ineligible - unknown reason: type: string enum: - main_document_deliverable - invalid_input - invalid_target - transport_unavailable - rate_limited - capacity_limited inputSha256: type: - string - 'null' pattern: ^[a-f0-9]{64}$ observation: oneOf: - type: 'null' - type: object additionalProperties: false required: - method - requestedUrlSha256 - finalUrlSha256 - redirectCount - status - contentType - rootRequests properties: method: type: string const: GET requestedUrlSha256: type: string pattern: ^[a-f0-9]{64}$ finalUrlSha256: type: string pattern: ^[a-f0-9]{64}$ redirectCount: type: integer minimum: 0 maximum: 3 status: type: integer minimum: 100 maximum: 599 contentType: type: - string - 'null' maxLength: 100 rootRequests: type: integer const: 0 purchaseBinding: type: object additionalProperties: false required: - offerId - priceCents - amountAtomic - directRoute - payanRoute - submitUnchangedBodyPromptly - caveat properties: offerId: type: string const: kh70zbzh8m5awkegpvn7tc82798aed20 priceCents: type: integer const: 500 amountAtomic: type: string const: '5000000' directRoute: type: string const: /site-release-audit payanRoute: type: string const: https://payanagent.com/x402/kh70zbzh8m5awkegpvn7tc82798aed20 submitUnchangedBodyPromptly: type: boolean const: true caveat: type: string minLength: 1 maxLength: 300 X402HealthReport: type: object additionalProperties: false required: - product - version - healthId - checkedAt - target - health - payment - disclaimer - reportSha256 properties: product: type: string const: x402 Endpoint Health Snapshot version: type: string const: 1.0.0 healthId: type: string pattern: ^[a-f0-9]{24}$ checkedAt: type: string format: date-time target: type: object additionalProperties: true health: type: object additionalProperties: false required: - healthy - score - challengeValid - resourceBound - baseCanonicalUsdc - bazaarDiscoverable properties: healthy: type: boolean score: type: integer minimum: 0 maximum: 100 challengeValid: type: boolean resourceBound: type: boolean baseCanonicalUsdc: type: boolean bazaarDiscoverable: type: boolean payment: type: - object - 'null' additionalProperties: true disclaimer: type: string reportSha256: type: string pattern: ^[a-f0-9]{64}$ WebsiteEvidenceReport: type: object required: - schemaVersion - product - observedAt - target - http - tls - summary - checks - aiDiscovery - dossierId - reportSha256 properties: schemaVersion: type: string const: 1.1.0 product: type: string const: Website Release Evidence Dossier observedAt: type: string format: date-time target: type: object additionalProperties: true http: type: object additionalProperties: true tls: type: - object - 'null' additionalProperties: true summary: type: object required: - score - possible - grade - verdict - ready - passes - warnings - failures - sections properties: score: type: number minimum: 0 maximum: 100 possible: type: number const: 100 grade: type: string enum: - A - B - C - D - F verdict: type: string enum: - strong-baseline - improvements-recommended - material-gaps ready: type: boolean passes: type: integer minimum: 0 warnings: type: integer minimum: 0 failures: type: integer minimum: 0 sections: type: object additionalProperties: true checks: type: array minItems: 22 maxItems: 22 items: $ref: '#/components/schemas/WebsiteAuditCheck' aiDiscovery: type: object description: AEO, GEO, and agent-discovery findings plus bounded same-origin root-file evidence and evidence-derived remediation candidates. additionalProperties: false required: - contractVersion - methodology - dimensions - summary - findings - remediations - rootEvidence - networkScope - caveats properties: contractVersion: type: string const: 1.1.0 methodology: type: string const: root-evidence-v1 dimensions: type: object additionalProperties: false required: - aeo - geo - agentDiscovery properties: aeo: type: string const: Answer Engine Optimization (AEO) geo: type: string const: Generative Engine Optimization (GEO) agentDiscovery: type: string const: Agent discovery readiness summary: type: object additionalProperties: false required: - passes - warnings - failures - notObserved properties: passes: type: integer minimum: 0 maximum: 7 warnings: type: integer minimum: 0 maximum: 7 failures: type: integer minimum: 0 maximum: 7 notObserved: type: integer minimum: 0 maximum: 3 findings: type: array minItems: 7 maxItems: 7 items: type: object additionalProperties: false required: - id - dimensions - status - checkIds - remediationIds - message - evidence properties: id: type: string enum: - page-identity - content-structure - structured-page-identity - page-indexability - robots-txt - llms-txt - sitemap-xml dimensions: type: array minItems: 1 maxItems: 3 uniqueItems: true items: type: string enum: - aeo - geo - agent-discovery status: type: string enum: - pass - warning - fail - not-observed checkIds: type: array maxItems: 4 uniqueItems: true items: type: string remediationIds: type: array maxItems: 2 uniqueItems: true items: type: string enum: - json-ld-webpage - head-meta - robots-txt - llms-txt - sitemap-xml message: type: string maxLength: 300 evidence: type: object additionalProperties: true remediations: type: array minItems: 5 maxItems: 5 items: type: object additionalProperties: false required: - id - artifact - target - action - contentType - code - codeSha256 - checkIds - inputsNeeded - reviewRequired - rationale properties: id: type: string enum: - json-ld-webpage - head-meta - robots-txt - llms-txt - sitemap-xml artifact: type: string maxLength: 100 target: type: string maxLength: 100 action: type: string enum: - insert - merge - review - none - needs-input contentType: type: string enum: - application/ld+json - text/html - text/plain - text/markdown - application/xml code: type: - string - 'null' maxLength: 8192 codeSha256: type: - string - 'null' pattern: ^[a-f0-9]{64}$ checkIds: type: array maxItems: 4 uniqueItems: true items: type: string inputsNeeded: type: array maxItems: 4 uniqueItems: true items: type: string reviewRequired: type: boolean rationale: type: string maxLength: 500 rootEvidence: type: object additionalProperties: false required: - contractVersion - originSha256 - additionalRequests - files - evidenceSha256 properties: contractVersion: type: string const: 1.1.0 originSha256: type: - string - 'null' pattern: ^[a-f0-9]{64}$ additionalRequests: type: integer minimum: 0 maximum: 3 files: type: object additionalProperties: false required: - robotsTxt - llmsTxt - sitemapXml properties: robotsTxt: type: object additionalProperties: false required: - path - status - contentType - bodyBytes - bodySha256 - result - reason - representationEncoding - tlsProtocol - facts - evidenceSha256 properties: path: type: string enum: - /robots.txt - /llms.txt - /sitemap.xml status: type: - integer - 'null' minimum: 0 maximum: 599 contentType: type: - string - 'null' maxLength: 100 bodyBytes: type: - integer - 'null' minimum: 0 maximum: 262144 bodySha256: type: - string - 'null' pattern: ^[a-f0-9]{64}$ result: type: string enum: - present - missing - invalid - not-observed reason: type: string maxLength: 200 representationEncoding: type: string const: identity tlsProtocol: type: - string - 'null' enum: - TLSv1.2 - TLSv1.3 - null facts: type: - object - 'null' additionalProperties: true evidenceSha256: type: string pattern: ^[a-f0-9]{64}$ llmsTxt: type: object additionalProperties: false required: - path - status - contentType - bodyBytes - bodySha256 - result - reason - representationEncoding - tlsProtocol - facts - evidenceSha256 properties: path: type: string enum: - /robots.txt - /llms.txt - /sitemap.xml status: type: - integer - 'null' minimum: 0 maximum: 599 contentType: type: - string - 'null' maxLength: 100 bodyBytes: type: - integer - 'null' minimum: 0 maximum: 262144 bodySha256: type: - string - 'null' pattern: ^[a-f0-9]{64}$ result: type: string enum: - present - missing - invalid - not-observed reason: type: string maxLength: 200 representationEncoding: type: string const: identity tlsProtocol: type: - string - 'null' enum: - TLSv1.2 - TLSv1.3 - null facts: type: - object - 'null' additionalProperties: true evidenceSha256: type: string pattern: ^[a-f0-9]{64}$ sitemapXml: type: object additionalProperties: false required: - path - status - contentType - bodyBytes - bodySha256 - result - reason - representationEncoding - tlsProtocol - facts - evidenceSha256 properties: path: type: string enum: - /robots.txt - /llms.txt - /sitemap.xml status: type: - integer - 'null' minimum: 0 maximum: 599 contentType: type: - string - 'null' maxLength: 100 bodyBytes: type: - integer - 'null' minimum: 0 maximum: 262144 bodySha256: type: - string - 'null' pattern: ^[a-f0-9]{64}$ result: type: string enum: - present - missing - invalid - not-observed reason: type: string maxLength: 200 representationEncoding: type: string const: identity tlsProtocol: type: - string - 'null' enum: - TLSv1.2 - TLSv1.3 - null facts: type: - object - 'null' additionalProperties: true evidenceSha256: type: string pattern: ^[a-f0-9]{64}$ evidenceSha256: type: string pattern: ^[a-f0-9]{64}$ networkScope: type: object additionalProperties: false required: - additionalRequests - htmlAnalyzed - requested - notObserved - statement properties: additionalRequests: type: integer minimum: 0 maximum: 3 htmlAnalyzed: type: boolean requested: type: array minItems: 0 maxItems: 3 uniqueItems: true items: type: string enum: - /robots.txt - /llms.txt - /sitemap.xml notObserved: type: array minItems: 0 maxItems: 3 uniqueItems: true items: type: string enum: - /robots.txt - /llms.txt - /sitemap.xml statement: type: string maxLength: 300 caveats: type: array minItems: 3 maxItems: 3 items: type: string maxLength: 300 dossierId: type: string pattern: ^[a-f0-9]{24}$ reportSha256: type: string pattern: ^[a-f0-9]{64}$