changedOutput schema / (root)
Previous value: -nullNew value: +{
+ "additionalProperties": false,
+ "properties": {
+ "data": {
+ "additionalProperties": false,
+ "properties": {
+ "brands": {
+ "items": {
+ "additionalProperties": false,
+ "properties": {
+ "citations": {
+ "additionalProperties": false,
+ "properties": {
+ "citations": {
+ "type": "integer"
+ },
+ "competitor_domains": {
+ "type": "integer"
+ },
+ "domains": {
+ "type": "integer"
+ },
+ "own_citations": {
+ "type": "integer"
+ },
+ "own_domains": {
+ "type": "integer"
+ },
+ "third_party_domains": {
+ "type": "integer"
+ }
+ },
+ "required": [
+ "citations",
+ "domains",
+ "own_domains",
+ "own_citations",
+ "competitor_domains",
+ "third_party_domains"
+ ],
+ "type": "object"
+ },
+ "collection": {
+ "additionalProperties": false,
+ "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"
+ },
+ "id": {
+ "type": "string"
+ },
+ "kind": {
+ "description": "brand: a brand tracked for itself. study: a brand watched for research.",
+ "type": "string"
+ },
+ "name": {
+ "type": "string"
+ },
+ "opportunities": {
+ "additionalProperties": false,
+ "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"
+ },
+ "readiness": {
+ "additionalProperties": false,
+ "description": "The latest site readiness scan; null before the first scan.",
+ "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 AI 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"
+ },
+ "share_of_voice": {
+ "additionalProperties": false,
+ "description": "The brand's share of all tracked-brand mentions in AI answers, 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"
+ },
+ "status": {
+ "description": "active or paused. A paused brand does not collect.",
+ "type": "string"
+ },
+ "traffic": {
+ "additionalProperties": false,
+ "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"
+ },
+ "url": {
+ "description": "The brand's website, or empty when none is set.",
+ "type": "string"
+ },
+ "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": [
+ "id",
+ "name",
+ "url",
+ "kind",
+ "status",
+ "visibility",
+ "share_of_voice",
+ "recommendation",
+ "citations",
+ "readiness",
+ "collection",
+ "traffic",
+ "opportunities"
+ ],
+ "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"
+ },
+ "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": [
+ "period",
+ "brands",
+ "pagination"
+ ],
+ "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"
+}