changedOutput schema / (root)
Previous value: -nullNew value: +{
+ "additionalProperties": false,
+ "properties": {
+ "data": {
+ "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"
+ },
+ "by_model": {
+ "description": "Mention rate per AI model, highest first. Models missing here returned no answers in the period.",
+ "items": {
+ "additionalProperties": false,
+ "properties": {
+ "mention_rate": {
+ "description": "Percentage of the model's answers that mention the brand.",
+ "type": "number"
+ },
+ "model": {
+ "description": "Model family key, as list_answers' model filter takes it.",
+ "type": "string"
+ },
+ "model_name": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "model",
+ "model_name",
+ "mention_rate"
+ ],
+ "type": "object"
+ },
+ "type": "array"
+ },
+ "collection": {
+ "additionalProperties": false,
+ "description": "Brand-wide; not filtered by segment.",
+ "properties": {
+ "active_prompts": {
+ "type": "integer"
+ },
+ "active_segments": {
+ "type": "integer"
+ },
+ "failed": {
+ "description": "Failed captures, plus each expected model that returned nothing for an active segment.",
+ "type": "integer"
+ },
+ "models_collecting": {
+ "description": "AI models that answered in the period.",
+ "type": "integer"
+ },
+ "models_expected": {
+ "description": "AI models the plan tracks.",
+ "type": "integer"
+ },
+ "state": {
+ "description": "ready: complete. partial: some captures failed or some models returned nothing. stale: nothing new in the period. insufficient: nothing to collect.",
+ "type": "string"
+ },
+ "unaccounted": {
+ "description": "Captures that were expected but neither succeeded nor failed.",
+ "type": "integer"
+ }
+ },
+ "required": [
+ "state",
+ "active_segments",
+ "active_prompts",
+ "failed",
+ "unaccounted",
+ "models_expected",
+ "models_collecting"
+ ],
+ "type": "object"
+ },
+ "competitors": {
+ "description": "Every tracked brand, including this one, by share of voice.",
+ "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"
+ },
+ "is_you": {
+ "description": "True for the brand being tracked.",
+ "type": "boolean"
+ },
+ "mentions": {
+ "type": "integer"
+ },
+ "share_of_voice": {
+ "type": [
+ "null",
+ "number"
+ ]
+ },
+ "visibility": {
+ "type": [
+ "null",
+ "number"
+ ]
+ }
+ },
+ "required": [
+ "brand",
+ "is_you",
+ "visibility",
+ "share_of_voice",
+ "mentions"
+ ],
+ "type": "object"
+ },
+ "type": "array"
+ },
+ "kind": {
+ "type": "string"
+ },
+ "latest_reports": {
+ "items": {
+ "additionalProperties": false,
+ "properties": {
+ "id": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string"
+ },
+ "period": {
+ "additionalProperties": false,
+ "properties": {
+ "from": {
+ "description": "First day, YYYY-MM-DD.",
+ "type": "string"
+ },
+ "to": {
+ "description": "Last day, YYYY-MM-DD.",
+ "type": "string"
+ }
+ },
+ "required": [
+ "from",
+ "to"
+ ],
+ "type": "object"
+ }
+ },
+ "required": [
+ "id",
+ "name",
+ "period"
+ ],
+ "type": "object"
+ },
+ "type": "array"
+ },
+ "opportunities": {
+ "additionalProperties": false,
+ "description": "Brand-wide; not filtered by segment.",
+ "properties": {
+ "high_priority": {
+ "description": "Opportunities in Now scoring 75 or more.",
+ "type": "integer"
+ },
+ "now": {
+ "description": "Opportunities in the Now stage, as list_opportunities counts them.",
+ "type": "integer"
+ },
+ "top": {
+ "additionalProperties": false,
+ "description": "The highest-ranked opportunity in Now; null when Now is empty.",
+ "properties": {
+ "id": {
+ "description": "Opportunity ID for get_opportunity.",
+ "type": "string"
+ },
+ "kind": {
+ "type": "string"
+ },
+ "score": {
+ "type": "integer"
+ },
+ "title": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "id",
+ "kind",
+ "title",
+ "score"
+ ],
+ "type": [
+ "null",
+ "object"
+ ]
+ }
+ },
+ "required": [
+ "now",
+ "high_priority",
+ "top"
+ ],
+ "type": "object"
+ },
+ "outcomes": {
+ "description": "How answers treated the brand.",
+ "items": {
+ "additionalProperties": false,
+ "properties": {
+ "answers": {
+ "type": "integer"
+ },
+ "outcome": {
+ "type": "string"
+ },
+ "share": {
+ "description": "Percentage of classified answers.",
+ "type": [
+ "null",
+ "number"
+ ]
+ }
+ },
+ "required": [
+ "outcome",
+ "answers",
+ "share"
+ ],
+ "type": "object"
+ },
+ "type": "array"
+ },
+ "pages": {
+ "additionalProperties": false,
+ "description": "Content Studio pages by lane.",
+ "properties": {
+ "in_progress": {
+ "type": "integer"
+ },
+ "live": {
+ "type": "integer"
+ },
+ "needs_refresh": {
+ "type": "integer"
+ }
+ },
+ "required": [
+ "in_progress",
+ "live",
+ "needs_refresh"
+ ],
+ "type": "object"
+ },
+ "period": {
+ "additionalProperties": false,
+ "properties": {
+ "from": {
+ "description": "First day, YYYY-MM-DD.",
+ "type": "string"
+ },
+ "to": {
+ "description": "Last day, YYYY-MM-DD.",
+ "type": "string"
+ }
+ },
+ "required": [
+ "from",
+ "to"
+ ],
+ "type": "object"
+ },
+ "readiness": {
+ "additionalProperties": false,
+ "description": "Brand-wide; not filtered by segment.",
+ "properties": {
+ "change": {
+ "description": "Change on the previous comparable scan, in points; null when not comparable.",
+ "type": [
+ "null",
+ "number"
+ ]
+ },
+ "critical": {
+ "description": "Open critical findings.",
+ "type": "integer"
+ },
+ "major": {
+ "description": "Open major findings.",
+ "type": "integer"
+ },
+ "scan_id": {
+ "type": "string"
+ },
+ "scanned_at": {
+ "type": "string"
+ },
+ "score": {
+ "description": "Readiness score, 0-100.",
+ "type": [
+ "null",
+ "number"
+ ]
+ },
+ "status": {
+ "type": "string"
+ },
+ "verdict": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "scan_id",
+ "status",
+ "score",
+ "change",
+ "verdict",
+ "critical",
+ "major",
+ "scanned_at"
+ ],
+ "type": [
+ "null",
+ "object"
+ ]
+ },
+ "recommendation": {
+ "additionalProperties": false,
+ "description": "Share of analysed answers that recommend the brand, 0-100.",
+ "properties": {
+ "answers": {
+ "description": "AI answers the value is based on.",
+ "type": "integer"
+ },
+ "change": {
+ "description": "Change on the previous period of the same length, in percentage points; null when either period has no evidence.",
+ "type": [
+ "null",
+ "number"
+ ]
+ },
+ "mentions": {
+ "description": "Brand mentions the value is based on (share of voice).",
+ "type": [
+ "null",
+ "integer"
+ ]
+ },
+ "models_collecting": {
+ "description": "AI models that answered in the period.",
+ "type": "integer"
+ },
+ "models_expected": {
+ "description": "AI models the plan tracks. Fewer collecting than expected means the value covers only part of the AI landscape.",
+ "type": "integer"
+ },
+ "period": {
+ "additionalProperties": false,
+ "properties": {
+ "from": {
+ "description": "First day, YYYY-MM-DD.",
+ "type": "string"
+ },
+ "to": {
+ "description": "Last day, YYYY-MM-DD.",
+ "type": "string"
+ }
+ },
+ "required": [
+ "from",
+ "to"
+ ],
+ "type": "object"
+ },
+ "value": {
+ "description": "Percentage, rounded to one decimal place; null when there is no evidence.",
+ "type": [
+ "null",
+ "number"
+ ]
+ }
+ },
+ "required": [
+ "value",
+ "change",
+ "answers",
+ "models_collecting",
+ "models_expected",
+ "period"
+ ],
+ "type": "object"
+ },
+ "retention": {
+ "additionalProperties": false,
+ "description": "Set when the plan's history limit shortened the period.",
+ "properties": {
+ "effective_from": {
+ "type": "string"
+ },
+ "message": {
+ "type": "string"
+ },
+ "requested_from": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "requested_from",
+ "effective_from",
+ "message"
+ ],
+ "type": [
+ "null",
+ "object"
+ ]
+ },
+ "segment": {
+ "additionalProperties": false,
+ "description": "The segment the answer metrics are filtered to; null for all segments.",
+ "properties": {
+ "id": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "id",
+ "name"
+ ],
+ "type": [
+ "null",
+ "object"
+ ]
+ },
+ "share_of_voice": {
+ "additionalProperties": false,
+ "description": "The brand's share of all tracked-brand mentions, 0-100.",
+ "properties": {
+ "answers": {
+ "description": "AI answers the value is based on.",
+ "type": "integer"
+ },
+ "change": {
+ "description": "Change on the previous period of the same length, in percentage points; null when either period has no evidence.",
+ "type": [
+ "null",
+ "number"
+ ]
+ },
+ "mentions": {
+ "description": "Brand mentions the value is based on (share of voice).",
+ "type": [
+ "null",
+ "integer"
+ ]
+ },
+ "models_collecting": {
+ "description": "AI models that answered in the period.",
+ "type": "integer"
+ },
+ "models_expected": {
+ "description": "AI models the plan tracks. Fewer collecting than expected means the value covers only part of the AI landscape.",
+ "type": "integer"
+ },
+ "period": {
+ "additionalProperties": false,
+ "properties": {
+ "from": {
+ "description": "First day, YYYY-MM-DD.",
+ "type": "string"
+ },
+ "to": {
+ "description": "Last day, YYYY-MM-DD.",
+ "type": "string"
+ }
+ },
+ "required": [
+ "from",
+ "to"
+ ],
+ "type": "object"
+ },
+ "value": {
+ "description": "Percentage, rounded to one decimal place; null when there is no evidence.",
+ "type": [
+ "null",
+ "number"
+ ]
+ }
+ },
+ "required": [
+ "value",
+ "change",
+ "answers",
+ "models_collecting",
+ "models_expected",
+ "period"
+ ],
+ "type": "object"
+ },
+ "top_cited_domains": {
+ "description": "The domains AI answers cited most.",
+ "items": {
+ "additionalProperties": false,
+ "properties": {
+ "citations": {
+ "type": "integer"
+ },
+ "domain": {
+ "type": "string"
+ },
+ "ownership": {
+ "description": "own, competitor, or third_party.",
+ "type": "string"
+ },
+ "share": {
+ "description": "Percentage of all citations.",
+ "type": "number"
+ }
+ },
+ "required": [
+ "domain",
+ "ownership",
+ "citations",
+ "share"
+ ],
+ "type": "object"
+ },
+ "type": "array"
+ },
+ "traffic": {
+ "additionalProperties": false,
+ "description": "Brand-wide; not filtered by segment.",
+ "properties": {
+ "ai_referrals": {
+ "description": "Visits from people who clicked through from an AI answer.",
+ "type": "integer"
+ },
+ "ai_visits": {
+ "description": "AI crawler visits plus AI referrals.",
+ "type": "integer"
+ },
+ "connected": {
+ "description": "Whether site tracking is set up; when false the counts are 0 because nothing is measured.",
+ "type": "boolean"
+ },
+ "crawler_visits": {
+ "type": "integer"
+ },
+ "latest_visit_at": {
+ "type": "string"
+ },
+ "pages_reached": {
+ "type": "integer"
+ }
+ },
+ "required": [
+ "connected",
+ "ai_visits",
+ "crawler_visits",
+ "ai_referrals",
+ "pages_reached",
+ "latest_visit_at"
+ ],
+ "type": "object"
+ },
+ "visibility": {
+ "additionalProperties": false,
+ "description": "How visible the brand is in AI answers, 0-100: how often answers mention it, weighted by how early.",
+ "properties": {
+ "answers": {
+ "description": "AI answers the value is based on.",
+ "type": "integer"
+ },
+ "change": {
+ "description": "Change on the previous period of the same length, in percentage points; null when either period has no evidence.",
+ "type": [
+ "null",
+ "number"
+ ]
+ },
+ "mentions": {
+ "description": "Brand mentions the value is based on (share of voice).",
+ "type": [
+ "null",
+ "integer"
+ ]
+ },
+ "models_collecting": {
+ "description": "AI models that answered in the period.",
+ "type": "integer"
+ },
+ "models_expected": {
+ "description": "AI models the plan tracks. Fewer collecting than expected means the value covers only part of the AI landscape.",
+ "type": "integer"
+ },
+ "period": {
+ "additionalProperties": false,
+ "properties": {
+ "from": {
+ "description": "First day, YYYY-MM-DD.",
+ "type": "string"
+ },
+ "to": {
+ "description": "Last day, YYYY-MM-DD.",
+ "type": "string"
+ }
+ },
+ "required": [
+ "from",
+ "to"
+ ],
+ "type": "object"
+ },
+ "value": {
+ "description": "Percentage, rounded to one decimal place; null when there is no evidence.",
+ "type": [
+ "null",
+ "number"
+ ]
+ }
+ },
+ "required": [
+ "value",
+ "change",
+ "answers",
+ "models_collecting",
+ "models_expected",
+ "period"
+ ],
+ "type": "object"
+ }
+ },
+ "required": [
+ "brand",
+ "kind",
+ "segment",
+ "period",
+ "visibility",
+ "share_of_voice",
+ "recommendation",
+ "by_model",
+ "competitors",
+ "outcomes",
+ "top_cited_domains",
+ "readiness",
+ "collection",
+ "traffic",
+ "opportunities",
+ "pages",
+ "latest_reports",
+ "retention"
+ ],
+ "type": "object"
+ },
+ "generated_at": {
+ "description": "RFC 3339 time the response was made.",
+ "type": "string"
+ },
+ "schema_version": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "schema_version",
+ "generated_at",
+ "data"
+ ],
+ "type": "object"
+}