changedOutput schema / properties / data / anyOf
Previous value: -[
- {
- "additionalProperties": false,
- "properties": {
- "brand": {
- "additionalProperties": false,
- "properties": {
- "id": {
- "type": "string"
- },
- "name": {
- "type": "string"
- },
- "url": {
- "description": "The brand's website, or empty when none is set.",
- "type": "string"
- }
- },
- "required": [
- "id",
- "name",
- "url"
- ],
- "type": "object"
- },
- "lenses": {
- "description": "Readiness, SEO health and security scores.",
- "items": {
- "additionalProperties": false,
- "properties": {
- "lens": {
- "type": "string"
- },
- "score": {
- "type": [
- "null",
- "number"
- ]
- },
- "verdict": {
- "type": "string"
- }
- },
- "required": [
- "lens",
- "score",
- "verdict"
- ],
- "type": "object"
- },
- "type": "array"
- },
- "open_findings": {
- "additionalProperties": false,
- "description": "Checks the site fails or only partly passes, by severity. view action_plan lists them.",
- "properties": {
- "critical": {
- "type": "integer"
- },
- "info": {
- "type": "integer"
- },
- "major": {
- "type": "integer"
- },
- "minor": {
- "type": "integer"
- },
- "total": {
- "type": "integer"
- }
- },
- "required": [
- "critical",
- "major",
- "minor",
- "info",
- "total"
- ],
- "type": "object"
- },
- "pages_audited": {
- "type": "integer"
- },
- "passing_checks": {
- "type": "integer"
- },
- "pillars": {
- "items": {
- "additionalProperties": false,
- "properties": {
- "label": {
- "type": "string"
- },
- "pillar": {
- "type": "string"
- },
- "points_awarded": {
- "type": "number"
- },
- "points_possible": {
- "type": "number"
- }
- },
- "required": [
- "pillar",
- "label",
- "points_awarded",
- "points_possible"
- ],
- "type": "object"
- },
- "type": "array"
- },
- "poll_after_seconds": {
- "description": "While a scan runs, how long to wait before reading again; 0 otherwise.",
- "type": "integer"
- },
- "progress": {
- "additionalProperties": false,
- "description": "Set while a scan runs.",
- "properties": {
- "message": {
- "type": "string"
- },
- "page_limit": {
- "type": "integer"
- },
- "pages_fetched": {
- "type": "integer"
- },
- "percent": {
- "type": "integer"
- },
- "stage": {
- "type": "string"
- }
- },
- "required": [
- "stage",
- "message",
- "percent",
- "pages_fetched",
- "page_limit"
- ],
- "type": [
- "null",
- "object"
- ]
- },
- "scan": {
- "additionalProperties": false,
- "description": "The scan summarised; null before the first scan.",
- "properties": {
- "completed_at": {
- "type": "string"
- },
- "error": {
- "type": "string"
- },
- "id": {
- "description": "Scan ID, the run_id other readiness calls take.",
- "type": "string"
- },
- "started_at": {
- "type": "string"
- },
- "status": {
- "description": "queued, processing, complete, or failed.",
- "type": "string"
- },
- "url": {
- "type": "string"
- }
- },
- "required": [
- "id",
- "status",
- "url",
- "error",
- "started_at",
- "completed_at"
- ],
- "type": [
- "null",
- "object"
- ]
- },
- "scan_in_progress": {
- "type": "boolean"
- },
- "score": {
- "description": "Readiness score, 0-100.",
- "type": [
- "null",
- "number"
- ]
- },
- "verdict": {
- "description": "Excellent (90+), Good (75+), Needs work (60+), Poor (40+), or Critical.",
- "type": "string"
- },
- "view": {
- "type": "string"
- }
- },
- "required": [
- "brand",
- "view",
- "scan",
- "score",
- "verdict",
- "lenses",
- "pillars",
- "open_findings",
- "passing_checks",
- "pages_audited",
- "scan_in_progress",
- "progress",
- "poll_after_seconds"
- ],
- "type": "object"
- },
- {
- "additionalProperties": false,
- "properties": {
- "brand": {
- "additionalProperties": false,
- "properties": {
- "id": {
- "type": "string"
- },
- "name": {
- "type": "string"
- },
- "url": {
- "description": "The brand's website, or empty when none is set.",
- "type": "string"
- }
- },
- "required": [
- "id",
- "name",
- "url"
- ],
- "type": "object"
- },
- "findings": {
- "items": {
- "additionalProperties": false,
- "properties": {
- "affected_pages": {
- "type": "integer"
- },
- "check_id": {
- "description": "Pass to get_readiness_finding or verify_readiness_fix.",
- "type": "string"
- },
- "consequence": {
- "type": "string"
- },
- "effort_minutes": {
- "type": [
- "null",
- "integer"
- ]
- },
- "fix_type": {
- "type": "string"
- },
- "label": {
- "type": "string"
- },
- "latest_check": {
- "additionalProperties": false,
- "description": "The latest re-check since the scan.",
- "properties": {
- "check_id": {
- "type": "string"
- },
- "completed_at": {
- "type": "string"
- },
- "created_at": {
- "type": "string"
- },
- "error": {
- "type": "string"
- },
- "id": {
- "description": "The check_request_id get_readiness_finding takes.",
- "type": "string"
- },
- "per_url": {
- "items": {
- "additionalProperties": false,
- "properties": {
- "status": {
- "type": "string"
- },
- "url": {
- "type": "string"
- }
- },
- "required": [
- "url",
- "status"
- ],
- "type": "object"
- },
- "type": "array"
- },
- "recharges_at": {
- "description": "When the re-check's charge returns to the monthly allowance; empty when it used none.",
- "type": "string"
- },
- "resolved": {
- "description": "Whether the issue is fixed; null until complete.",
- "type": [
- "null",
- "boolean"
- ]
- },
- "status": {
- "description": "queued, processing, complete, or failed.",
- "type": "string"
- }
- },
- "required": [
- "id",
- "check_id",
- "status",
- "resolved",
- "per_url",
- "error",
- "created_at",
- "completed_at",
- "recharges_at"
- ],
- "type": [
- "null",
- "object"
- ]
- },
- "owner_role": {
- "type": "string"
- },
- "pillar": {
- "type": "string"
- },
- "points_recoverable": {
- "type": "number"
- },
- "severity": {
- "description": "critical, major, minor, or info; empty when passing.",
- "type": "string"
- },
- "site_wide": {
- "description": "One fix applies to the whole site.",
- "type": "boolean"
- },
- "status": {
- "description": "fail, warning, pass, or not_applicable.",
- "type": "string"
- }
- },
- "required": [
- "check_id",
- "label",
- "pillar",
- "status",
- "severity",
- "consequence",
- "points_recoverable",
- "effort_minutes",
- "owner_role",
- "fix_type",
- "affected_pages",
- "site_wide",
- "latest_check"
- ],
- "type": "object"
- },
- "type": "array"
- },
- "open_findings": {
- "additionalProperties": false,
- "properties": {
- "critical": {
- "type": "integer"
- },
- "info": {
- "type": "integer"
- },
- "major": {
- "type": "integer"
- },
- "minor": {
- "type": "integer"
- },
- "total": {
- "type": "integer"
- }
- },
- "required": [
- "critical",
- "major",
- "minor",
- "info",
- "total"
- ],
- "type": "object"
- },
- "pagination": {
- "additionalProperties": false,
- "properties": {
- "next_cursor": {
- "description": "Pass as cursor to get the next page; empty on the last page.",
- "type": "string"
- },
- "total": {
- "description": "Items across all pages; null when not counted.",
- "type": [
- "null",
- "integer"
- ]
- }
- },
- "required": [
- "next_cursor",
- "total"
- ],
- "type": "object"
- },
- "questions_no_page_answers": {
- "description": "Tracked prompts no page on the site answers well.",
- "items": {
- "additionalProperties": false,
- "properties": {
- "monthly_ai_searches": {
- "type": [
- "null",
- "integer"
- ]
- },
- "opportunity_id": {
- "description": "The content gap opportunity for it, when there is one.",
- "type": "string"
- },
- "prompt_id": {
- "type": "string"
- },
- "text": {
- "type": "string"
- }
- },
- "required": [
- "prompt_id",
- "text",
- "monthly_ai_searches",
- "opportunity_id"
- ],
- "type": "object"
- },
- "type": "array"
- },
- "scan_id": {
- "type": "string"
- },
- "view": {
- "type": "string"
- }
- },
- "required": [
- "brand",
- "view",
- "scan_id",
- "open_findings",
- "findings",
- "questions_no_page_answers",
- "pagination"
- ],
- "type": "object"
- },
- {
- "additionalProperties": false,
- "properties": {
- "brand": {
- "additionalProperties": false,
- "properties": {
- "id": {
- "type": "string"
- },
- "name": {
- "type": "string"
- },
- "url": {
- "description": "The brand's website, or empty when none is set.",
- "type": "string"
- }
- },
- "required": [
- "id",
- "name",
- "url"
- ],
- "type": "object"
- },
- "pages": {
- "items": {
- "additionalProperties": false,
- "properties": {
- "page_type": {
- "type": "string"
- },
- "response_time_ms": {
- "type": "integer"
- },
- "status_code": {
- "type": "integer"
- },
- "text_chars": {
- "type": "integer"
- },
- "url": {
- "type": "string"
- }
- },
- "required": [
- "url",
- "page_type",
- "status_code",
- "response_time_ms",
- "text_chars"
- ],
- "type": "object"
- },
- "type": "array"
- },
- "pagination": {
- "additionalProperties": false,
- "properties": {
- "next_cursor": {
- "description": "Pass as cursor to get the next page; empty on the last page.",
- "type": "string"
- },
- "total": {
- "description": "Items across all pages; null when not counted.",
- "type": [
- "null",
- "integer"
- ]
- }
- },
- "required": [
- "next_cursor",
- "total"
- ],
- "type": "object"
- },
- "scan_id": {
- "type": "string"
- },
- "view": {
- "type": "string"
- }
- },
- "required": [
- "brand",
- "view",
- "scan_id",
- "pages",
- "pagination"
- ],
- "type": "object"
- },
- {
- "additionalProperties": false,
- "properties": {
- "brand": {
- "additionalProperties": false,
- "properties": {
- "id": {
- "type": "string"
- },
- "name": {
- "type": "string"
- },
- "url": {
- "description": "The brand's website, or empty when none is set.",
- "type": "string"
- }
- },
- "required": [
- "id",
- "name",
- "url"
- ],
- "type": "object"
- },
- "pagination": {
- "additionalProperties": false,
- "properties": {
- "next_cursor": {
- "description": "Pass as cursor to get the next page; empty on the last page.",
- "type": "string"
- },
- "total": {
- "description": "Items across all pages; null when not counted.",
- "type": [
- "null",
- "integer"
- ]
- }
- },
- "required": [
- "next_cursor",
- "total"
- ],
- "type": "object"
- },
- "scans": {
- "items": {
- "additionalProperties": false,
- "properties": {
- "completed_at": {
- "type": "string"
- },
- "created_at": {
- "type": "string"
- },
- "error": {
- "type": "string"
- },
- "fixed": {
- "description": "Findings fixed since the previous scan.",
- "type": "integer"
- },
- "new": {
- "type": "integer"
- },
- "pages_audited": {
- "type": [
- "null",
- "integer"
- ]
- },
- "readiness": {
- "type": [
- "null",
- "number"
- ]
- },
- "regressed": {
- "type": "integer"
- },
- "scan_id": {
- "type": "string"
- },
- "security": {
- "type": [
- "null",
- "number"
- ]
- },
- "seo": {
- "type": [
- "null",
- "number"
- ]
- },
- "status": {
- "type": "string"
- },
- "trigger": {
- "description": "manual or scheduled.",
- "type": "string"
- }
- },
- "required": [
- "scan_id",
- "status",
- "trigger",
- "readiness",
- "seo",
- "security",
- "pages_audited",
- "fixed",
- "new",
- "regressed",
- "created_at",
- "completed_at",
- "error"
- ],
- "type": "object"
- },
- "type": "array"
- },
- "view": {
- "type": "string"
- }
- },
- "required": [
- "brand",
- "view",
- "scans",
- "pagination"
- ],
- "type": "object"
- },
- {
- "additionalProperties": false,
- "properties": {
- "allowed": {
- "description": "Whether competitor scans are available.",
- "type": "boolean"
- },
- "brand": {
- "additionalProperties": false,
- "properties": {
- "id": {
- "type": "string"
- },
- "name": {
- "type": "string"
- },
- "url": {
- "description": "The brand's website, or empty when none is set.",
- "type": "string"
- }
- },
- "required": [
- "id",
- "name",
- "url"
- ],
- "type": "object"
- },
- "competitors": {
- "items": {
- "additionalProperties": false,
- "properties": {
- "brand": {
- "additionalProperties": false,
- "properties": {
- "id": {
- "type": "string"
- },
- "name": {
- "type": "string"
- },
- "url": {
- "description": "The brand's website, or empty when none is set.",
- "type": "string"
- }
- },
- "required": [
- "id",
- "name",
- "url"
- ],
- "type": "object"
- },
- "next_available_at": {
- "type": "string"
- },
- "scan_id": {
- "type": "string"
- },
- "scanned_at": {
- "type": "string"
- },
- "scores": {
- "additionalProperties": false,
- "properties": {
- "readiness": {
- "type": [
- "null",
- "number"
- ]
- },
- "security": {
- "type": [
- "null",
- "number"
- ]
- },
- "seo": {
- "type": [
- "null",
- "number"
- ]
- }
- },
- "required": [
- "readiness",
- "seo",
- "security"
- ],
- "type": [
- "null",
- "object"
- ]
- },
- "status": {
- "type": "string"
- }
- },
- "required": [
- "brand",
- "scan_id",
- "status",
- "scores",
- "scanned_at",
- "next_available_at"
- ],
- "type": "object"
- },
- "type": "array"
- },
- "gaps": {
- "description": "Checks competitors pass and the brand does not.",
- "items": {
- "additionalProperties": false,
- "properties": {
- "check_id": {
- "type": "string"
- },
- "competitors": {
- "items": {
- "type": "string"
- },
- "type": "array"
- },
- "fix_summary": {
- "type": "string"
- },
- "label": {
- "type": "string"
- },
- "pillar": {
- "type": "string"
- },
- "points_possible": {
- "type": "number"
- },
- "your_status": {
- "type": "string"
- }
- },
- "required": [
- "check_id",
- "label",
- "pillar",
- "your_status",
- "competitors",
- "points_possible",
- "fix_summary"
- ],
- "type": "object"
- },
- "type": "array"
- },
- "reason": {
- "description": "Why not: plan, role, or no_competitors.",
- "type": "string"
- },
- "view": {
- "type": "string"
- },
- "you": {
- "additionalProperties": false,
- "properties": {
- "readiness": {
- "type": [
- "null",
- "number"
- ]
- },
- "security": {
- "type": [
- "null",
- "number"
- ]
- },
- "seo": {
- "type": [
- "null",
- "number"
- ]
- }
- },
- "required": [
- "readiness",
- "seo",
- "security"
- ],
- "type": [
- "null",
- "object"
- ]
- }
- },
- "required": [
- "brand",
- "view",
- "allowed",
- "reason",
- "you",
- "competitors",
- "gaps"
- ],
- "type": "object"
- }
-]New value: +[
+ {
+ "additionalProperties": false,
+ "properties": {
+ "brand": {
+ "additionalProperties": false,
+ "properties": {
+ "id": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string"
+ },
+ "url": {
+ "description": "The brand's website, or empty when none is set.",
+ "type": "string"
+ }
+ },
+ "required": [
+ "id",
+ "name",
+ "url"
+ ],
+ "type": "object"
+ },
+ "can_start_scan": {
+ "description": "Whether run_readiness_scan can start a scan for you now.",
+ "type": "boolean"
+ },
+ "disabled_reason": {
+ "description": "Why it cannot: scheduled_only (later scans run weekly), run_active, role, or no_site; empty when it can.",
+ "type": "string"
+ },
+ "lenses": {
+ "description": "Readiness, SEO health and security scores.",
+ "items": {
+ "additionalProperties": false,
+ "properties": {
+ "lens": {
+ "type": "string"
+ },
+ "score": {
+ "type": [
+ "null",
+ "number"
+ ]
+ },
+ "verdict": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "lens",
+ "score",
+ "verdict"
+ ],
+ "type": "object"
+ },
+ "type": "array"
+ },
+ "next_run_at": {
+ "description": "When the next weekly scan runs; empty before the first scan completes.",
+ "type": "string"
+ },
+ "open_findings": {
+ "additionalProperties": false,
+ "description": "Checks the site fails or only partly passes, by severity. view action_plan lists them.",
+ "properties": {
+ "critical": {
+ "type": "integer"
+ },
+ "info": {
+ "type": "integer"
+ },
+ "major": {
+ "type": "integer"
+ },
+ "minor": {
+ "type": "integer"
+ },
+ "total": {
+ "type": "integer"
+ }
+ },
+ "required": [
+ "critical",
+ "major",
+ "minor",
+ "info",
+ "total"
+ ],
+ "type": "object"
+ },
+ "pages_audited": {
+ "type": "integer"
+ },
+ "passing_checks": {
+ "type": "integer"
+ },
+ "pillars": {
+ "items": {
+ "additionalProperties": false,
+ "properties": {
+ "label": {
+ "type": "string"
+ },
+ "pillar": {
+ "type": "string"
+ },
+ "points_awarded": {
+ "type": "number"
+ },
+ "points_possible": {
+ "type": "number"
+ }
+ },
+ "required": [
+ "pillar",
+ "label",
+ "points_awarded",
+ "points_possible"
+ ],
+ "type": "object"
+ },
+ "type": "array"
+ },
+ "poll_after_seconds": {
+ "description": "While a scan runs, how long to wait before reading again; 0 otherwise.",
+ "type": "integer"
+ },
+ "progress": {
+ "additionalProperties": false,
+ "description": "Set while a scan runs.",
+ "properties": {
+ "message": {
+ "type": "string"
+ },
+ "page_limit": {
+ "type": "integer"
+ },
+ "pages_fetched": {
+ "type": "integer"
+ },
+ "percent": {
+ "type": "integer"
+ },
+ "stage": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "stage",
+ "message",
+ "percent",
+ "pages_fetched",
+ "page_limit"
+ ],
+ "type": [
+ "null",
+ "object"
+ ]
+ },
+ "scan": {
+ "additionalProperties": false,
+ "description": "The scan summarised; null before the first scan.",
+ "properties": {
+ "completed_at": {
+ "type": "string"
+ },
+ "error": {
+ "type": "string"
+ },
+ "id": {
+ "description": "Scan ID, the run_id other readiness calls take.",
+ "type": "string"
+ },
+ "started_at": {
+ "type": "string"
+ },
+ "status": {
+ "description": "queued, processing, complete, or failed.",
+ "type": "string"
+ },
+ "url": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "id",
+ "status",
+ "url",
+ "error",
+ "started_at",
+ "completed_at"
+ ],
+ "type": [
+ "null",
+ "object"
+ ]
+ },
+ "scan_in_progress": {
+ "type": "boolean"
+ },
+ "score": {
+ "description": "Readiness score, 0-100.",
+ "type": [
+ "null",
+ "number"
+ ]
+ },
+ "verdict": {
+ "description": "Excellent (90+), Good (75+), Needs work (60+), Poor (40+), or Critical.",
+ "type": "string"
+ },
+ "view": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "brand",
+ "view",
+ "scan",
+ "score",
+ "verdict",
+ "lenses",
+ "pillars",
+ "open_findings",
+ "passing_checks",
+ "pages_audited",
+ "scan_in_progress",
+ "progress",
+ "poll_after_seconds",
+ "can_start_scan",
+ "disabled_reason",
+ "next_run_at"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "brand": {
+ "additionalProperties": false,
+ "properties": {
+ "id": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string"
+ },
+ "url": {
+ "description": "The brand's website, or empty when none is set.",
+ "type": "string"
+ }
+ },
+ "required": [
+ "id",
+ "name",
+ "url"
+ ],
+ "type": "object"
+ },
+ "findings": {
+ "items": {
+ "additionalProperties": false,
+ "properties": {
+ "affected_pages": {
+ "type": "integer"
+ },
+ "check_id": {
+ "description": "Pass to get_readiness_finding or verify_readiness_fix.",
+ "type": "string"
+ },
+ "consequence": {
+ "type": "string"
+ },
+ "effort_minutes": {
+ "type": [
+ "null",
+ "integer"
+ ]
+ },
+ "fix_type": {
+ "type": "string"
+ },
+ "label": {
+ "type": "string"
+ },
+ "latest_check": {
+ "additionalProperties": false,
+ "description": "The latest re-check since the scan.",
+ "properties": {
+ "check_id": {
+ "type": "string"
+ },
+ "completed_at": {
+ "type": "string"
+ },
+ "created_at": {
+ "type": "string"
+ },
+ "error": {
+ "type": "string"
+ },
+ "id": {
+ "description": "The check_request_id get_readiness_finding takes.",
+ "type": "string"
+ },
+ "per_url": {
+ "items": {
+ "additionalProperties": false,
+ "properties": {
+ "status": {
+ "type": "string"
+ },
+ "url": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "url",
+ "status"
+ ],
+ "type": "object"
+ },
+ "type": "array"
+ },
+ "recharges_at": {
+ "description": "When the re-check's charge returns to the monthly allowance; empty when it used none.",
+ "type": "string"
+ },
+ "resolved": {
+ "description": "Whether the issue is fixed; null until complete.",
+ "type": [
+ "null",
+ "boolean"
+ ]
+ },
+ "status": {
+ "description": "queued, processing, complete, or failed.",
+ "type": "string"
+ }
+ },
+ "required": [
+ "id",
+ "check_id",
+ "status",
+ "resolved",
+ "per_url",
+ "error",
+ "created_at",
+ "completed_at",
+ "recharges_at"
+ ],
+ "type": [
+ "null",
+ "object"
+ ]
+ },
+ "owner_role": {
+ "type": "string"
+ },
+ "pillar": {
+ "type": "string"
+ },
+ "points_recoverable": {
+ "type": "number"
+ },
+ "severity": {
+ "description": "critical, major, minor, or info; empty when passing.",
+ "type": "string"
+ },
+ "site_wide": {
+ "description": "One fix applies to the whole site.",
+ "type": "boolean"
+ },
+ "status": {
+ "description": "fail, warning, pass, or not_applicable.",
+ "type": "string"
+ }
+ },
+ "required": [
+ "check_id",
+ "label",
+ "pillar",
+ "status",
+ "severity",
+ "consequence",
+ "points_recoverable",
+ "effort_minutes",
+ "owner_role",
+ "fix_type",
+ "affected_pages",
+ "site_wide",
+ "latest_check"
+ ],
+ "type": "object"
+ },
+ "type": "array"
+ },
+ "open_findings": {
+ "additionalProperties": false,
+ "properties": {
+ "critical": {
+ "type": "integer"
+ },
+ "info": {
+ "type": "integer"
+ },
+ "major": {
+ "type": "integer"
+ },
+ "minor": {
+ "type": "integer"
+ },
+ "total": {
+ "type": "integer"
+ }
+ },
+ "required": [
+ "critical",
+ "major",
+ "minor",
+ "info",
+ "total"
+ ],
+ "type": "object"
+ },
+ "pagination": {
+ "additionalProperties": false,
+ "properties": {
+ "next_cursor": {
+ "description": "Pass as cursor to get the next page; empty on the last page.",
+ "type": "string"
+ },
+ "total": {
+ "description": "Items across all pages; null when not counted.",
+ "type": [
+ "null",
+ "integer"
+ ]
+ }
+ },
+ "required": [
+ "next_cursor",
+ "total"
+ ],
+ "type": "object"
+ },
+ "questions_no_page_answers": {
+ "description": "Tracked prompts no page on the site answers well.",
+ "items": {
+ "additionalProperties": false,
+ "properties": {
+ "monthly_ai_searches": {
+ "type": [
+ "null",
+ "integer"
+ ]
+ },
+ "opportunity_id": {
+ "description": "The content gap opportunity for it, when there is one.",
+ "type": "string"
+ },
+ "prompt_id": {
+ "type": "string"
+ },
+ "text": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "prompt_id",
+ "text",
+ "monthly_ai_searches",
+ "opportunity_id"
+ ],
+ "type": "object"
+ },
+ "type": "array"
+ },
+ "scan_id": {
+ "type": "string"
+ },
+ "view": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "brand",
+ "view",
+ "scan_id",
+ "open_findings",
+ "findings",
+ "questions_no_page_answers",
+ "pagination"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "brand": {
+ "additionalProperties": false,
+ "properties": {
+ "id": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string"
+ },
+ "url": {
+ "description": "The brand's website, or empty when none is set.",
+ "type": "string"
+ }
+ },
+ "required": [
+ "id",
+ "name",
+ "url"
+ ],
+ "type": "object"
+ },
+ "pages": {
+ "items": {
+ "additionalProperties": false,
+ "properties": {
+ "page_id": {
+ "description": "Pass to get_readiness view pages with page_id for this page's findings.",
+ "type": "string"
+ },
+ "page_type": {
+ "type": "string"
+ },
+ "response_time_ms": {
+ "type": "integer"
+ },
+ "status_code": {
+ "type": "integer"
+ },
+ "text_chars": {
+ "type": "integer"
+ },
+ "url": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "page_id",
+ "url",
+ "page_type",
+ "status_code",
+ "response_time_ms",
+ "text_chars"
+ ],
+ "type": "object"
+ },
+ "type": "array"
+ },
+ "pagination": {
+ "additionalProperties": false,
+ "properties": {
+ "next_cursor": {
+ "description": "Pass as cursor to get the next page; empty on the last page.",
+ "type": "string"
+ },
+ "total": {
+ "description": "Items across all pages; null when not counted.",
+ "type": [
+ "null",
+ "integer"
+ ]
+ }
+ },
+ "required": [
+ "next_cursor",
+ "total"
+ ],
+ "type": "object"
+ },
+ "scan_id": {
+ "type": "string"
+ },
+ "view": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "brand",
+ "view",
+ "scan_id",
+ "pages",
+ "pagination"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "brand": {
+ "additionalProperties": false,
+ "properties": {
+ "id": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string"
+ },
+ "url": {
+ "description": "The brand's website, or empty when none is set.",
+ "type": "string"
+ }
+ },
+ "required": [
+ "id",
+ "name",
+ "url"
+ ],
+ "type": "object"
+ },
+ "findings": {
+ "description": "Open findings that affect this page, in fix order; at most 25.",
+ "items": {
+ "additionalProperties": false,
+ "properties": {
+ "affected_pages": {
+ "type": "integer"
+ },
+ "check_id": {
+ "description": "Pass to get_readiness_finding or verify_readiness_fix.",
+ "type": "string"
+ },
+ "consequence": {
+ "type": "string"
+ },
+ "effort_minutes": {
+ "type": [
+ "null",
+ "integer"
+ ]
+ },
+ "fix_type": {
+ "type": "string"
+ },
+ "label": {
+ "type": "string"
+ },
+ "latest_check": {
+ "additionalProperties": false,
+ "description": "The latest re-check since the scan.",
+ "properties": {
+ "check_id": {
+ "type": "string"
+ },
+ "completed_at": {
+ "type": "string"
+ },
+ "created_at": {
+ "type": "string"
+ },
+ "error": {
+ "type": "string"
+ },
+ "id": {
+ "description": "The check_request_id get_readiness_finding takes.",
+ "type": "string"
+ },
+ "per_url": {
+ "items": {
+ "additionalProperties": false,
+ "properties": {
+ "status": {
+ "type": "string"
+ },
+ "url": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "url",
+ "status"
+ ],
+ "type": "object"
+ },
+ "type": "array"
+ },
+ "recharges_at": {
+ "description": "When the re-check's charge returns to the monthly allowance; empty when it used none.",
+ "type": "string"
+ },
+ "resolved": {
+ "description": "Whether the issue is fixed; null until complete.",
+ "type": [
+ "null",
+ "boolean"
+ ]
+ },
+ "status": {
+ "description": "queued, processing, complete, or failed.",
+ "type": "string"
+ }
+ },
+ "required": [
+ "id",
+ "check_id",
+ "status",
+ "resolved",
+ "per_url",
+ "error",
+ "created_at",
+ "completed_at",
+ "recharges_at"
+ ],
+ "type": [
+ "null",
+ "object"
+ ]
+ },
+ "owner_role": {
+ "type": "string"
+ },
+ "pillar": {
+ "type": "string"
+ },
+ "points_recoverable": {
+ "type": "number"
+ },
+ "severity": {
+ "description": "critical, major, minor, or info; empty when passing.",
+ "type": "string"
+ },
+ "site_wide": {
+ "description": "One fix applies to the whole site.",
+ "type": "boolean"
+ },
+ "status": {
+ "description": "fail, warning, pass, or not_applicable.",
+ "type": "string"
+ }
+ },
+ "required": [
+ "check_id",
+ "label",
+ "pillar",
+ "status",
+ "severity",
+ "consequence",
+ "points_recoverable",
+ "effort_minutes",
+ "owner_role",
+ "fix_type",
+ "affected_pages",
+ "site_wide",
+ "latest_check"
+ ],
+ "type": "object"
+ },
+ "type": "array"
+ },
+ "page": {
+ "additionalProperties": false,
+ "properties": {
+ "page_id": {
+ "description": "Pass to get_readiness view pages with page_id for this page's findings.",
+ "type": "string"
+ },
+ "page_type": {
+ "type": "string"
+ },
+ "response_time_ms": {
+ "type": "integer"
+ },
+ "status_code": {
+ "type": "integer"
+ },
+ "text_chars": {
+ "type": "integer"
+ },
+ "url": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "page_id",
+ "url",
+ "page_type",
+ "status_code",
+ "response_time_ms",
+ "text_chars"
+ ],
+ "type": "object"
+ },
+ "scan_id": {
+ "type": "string"
+ },
+ "total_findings": {
+ "type": "integer"
+ },
+ "view": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "brand",
+ "view",
+ "scan_id",
+ "page",
+ "findings",
+ "total_findings"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "brand": {
+ "additionalProperties": false,
+ "properties": {
+ "id": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string"
+ },
+ "url": {
+ "description": "The brand's website, or empty when none is set.",
+ "type": "string"
+ }
+ },
+ "required": [
+ "id",
+ "name",
+ "url"
+ ],
+ "type": "object"
+ },
+ "pagination": {
+ "additionalProperties": false,
+ "properties": {
+ "next_cursor": {
+ "description": "Pass as cursor to get the next page; empty on the last page.",
+ "type": "string"
+ },
+ "total": {
+ "description": "Items across all pages; null when not counted.",
+ "type": [
+ "null",
+ "integer"
+ ]
+ }
+ },
+ "required": [
+ "next_cursor",
+ "total"
+ ],
+ "type": "object"
+ },
+ "scans": {
+ "items": {
+ "additionalProperties": false,
+ "properties": {
+ "completed_at": {
+ "type": "string"
+ },
+ "created_at": {
+ "type": "string"
+ },
+ "error": {
+ "type": "string"
+ },
+ "fixed": {
+ "description": "Findings fixed since the previous scan.",
+ "type": "integer"
+ },
+ "new": {
+ "type": "integer"
+ },
+ "pages_audited": {
+ "type": [
+ "null",
+ "integer"
+ ]
+ },
+ "readiness": {
+ "type": [
+ "null",
+ "number"
+ ]
+ },
+ "regressed": {
+ "type": "integer"
+ },
+ "scan_id": {
+ "type": "string"
+ },
+ "security": {
+ "type": [
+ "null",
+ "number"
+ ]
+ },
+ "seo": {
+ "type": [
+ "null",
+ "number"
+ ]
+ },
+ "status": {
+ "type": "string"
+ },
+ "trigger": {
+ "description": "manual or scheduled.",
+ "type": "string"
+ }
+ },
+ "required": [
+ "scan_id",
+ "status",
+ "trigger",
+ "readiness",
+ "seo",
+ "security",
+ "pages_audited",
+ "fixed",
+ "new",
+ "regressed",
+ "created_at",
+ "completed_at",
+ "error"
+ ],
+ "type": "object"
+ },
+ "type": "array"
+ },
+ "view": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "brand",
+ "view",
+ "scans",
+ "pagination"
+ ],
+ "type": "object"
+ },
+ {
+ "additionalProperties": false,
+ "properties": {
+ "allowed": {
+ "description": "Whether competitor scans are available.",
+ "type": "boolean"
+ },
+ "brand": {
+ "additionalProperties": false,
+ "properties": {
+ "id": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string"
+ },
+ "url": {
+ "description": "The brand's website, or empty when none is set.",
+ "type": "string"
+ }
+ },
+ "required": [
+ "id",
+ "name",
+ "url"
+ ],
+ "type": "object"
+ },
+ "competitors": {
+ "items": {
+ "additionalProperties": false,
+ "properties": {
+ "brand": {
+ "additionalProperties": false,
+ "properties": {
+ "id": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string"
+ },
+ "url": {
+ "description": "The brand's website, or empty when none is set.",
+ "type": "string"
+ }
+ },
+ "required": [
+ "id",
+ "name",
+ "url"
+ ],
+ "type": "object"
+ },
+ "next_available_at": {
+ "type": "string"
+ },
+ "scan_id": {
+ "type": "string"
+ },
+ "scanned_at": {
+ "type": "string"
+ },
+ "scores": {
+ "additionalProperties": false,
+ "properties": {
+ "readiness": {
+ "type": [
+ "null",
+ "number"
+ ]
+ },
+ "security": {
+ "type": [
+ "null",
+ "number"
+ ]
+ },
+ "seo": {
+ "type": [
+ "null",
+ "number"
+ ]
+ }
+ },
+ "required": [
+ "readiness",
+ "seo",
+ "security"
+ ],
+ "type": [
+ "null",
+ "object"
+ ]
+ },
+ "status": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "brand",
+ "scan_id",
+ "status",
+ "scores",
+ "scanned_at",
+ "next_available_at"
+ ],
+ "type": "object"
+ },
+ "type": "array"
+ },
+ "cooldown_days": {
+ "description": "Days before a competitor can be scanned again.",
+ "type": "integer"
+ },
+ "gaps": {
+ "description": "Checks competitors pass and the brand does not.",
+ "items": {
+ "additionalProperties": false,
+ "properties": {
+ "check_id": {
+ "type": "string"
+ },
+ "competitors": {
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "fix_summary": {
+ "type": "string"
+ },
+ "label": {
+ "type": "string"
+ },
+ "pillar": {
+ "type": "string"
+ },
+ "points_possible": {
+ "type": "number"
+ },
+ "your_status": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "check_id",
+ "label",
+ "pillar",
+ "your_status",
+ "competitors",
+ "points_possible",
+ "fix_summary"
+ ],
+ "type": "object"
+ },
+ "type": "array"
+ },
+ "max_competitors": {
+ "description": "How many competitors can be scanned.",
+ "type": "integer"
+ },
+ "note": {
+ "description": "Where competitor scans are started: in the app, not through MCP.",
+ "type": "string"
+ },
+ "reason": {
+ "description": "Why not: plan, role, or no_competitors.",
+ "type": "string"
+ },
+ "view": {
+ "type": "string"
+ },
+ "you": {
+ "additionalProperties": false,
+ "properties": {
+ "readiness": {
+ "type": [
+ "null",
+ "number"
+ ]
+ },
+ "security": {
+ "type": [
+ "null",
+ "number"
+ ]
+ },
+ "seo": {
+ "type": [
+ "null",
+ "number"
+ ]
+ }
+ },
+ "required": [
+ "readiness",
+ "seo",
+ "security"
+ ],
+ "type": [
+ "null",
+ "object"
+ ]
+ }
+ },
+ "required": [
+ "brand",
+ "view",
+ "allowed",
+ "reason",
+ "max_competitors",
+ "cooldown_days",
+ "note",
+ "you",
+ "competitors",
+ "gaps"
+ ],
+ "type": "object"
+ }
+]