changedOutput schema / (root)
Previous value: -nullNew value: +{
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
+ "additionalProperties": false,
+ "properties": {
+ "advertising": {
+ "additionalProperties": false,
+ "description": "Independent advertising-policy state. Unavailable retains only status/providerWrites; a proposed policy is not active and no provider change is performed.",
+ "properties": {
+ "budgetId": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "campaigns": {
+ "items": {
+ "additionalProperties": false,
+ "properties": {
+ "accountRef": {
+ "type": "string"
+ },
+ "campaignRef": {
+ "type": "string"
+ },
+ "enabled": {
+ "type": "boolean"
+ },
+ "label": {
+ "type": "string"
+ },
+ "provider": {
+ "type": "string"
+ },
+ "segmentKey": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "segmentKey",
+ "label",
+ "provider",
+ "accountRef",
+ "campaignRef",
+ "enabled"
+ ],
+ "type": "object"
+ },
+ "type": "array"
+ },
+ "pending": {
+ "anyOf": [
+ {
+ "additionalProperties": false,
+ "properties": {
+ "expiresAt": {
+ "type": "string"
+ },
+ "proposalId": {
+ "type": "string"
+ },
+ "status": {
+ "const": "proposed",
+ "type": "string"
+ },
+ "value": {
+ "additionalProperties": false,
+ "properties": {
+ "currency": {
+ "description": "ISO-4217 budget currency. The current shared executable budget contract accepts EUR only; no exchange conversion is performed.",
+ "type": "string"
+ },
+ "dailyLimitCents": {
+ "description": "Global daily limit in integer cents of currency; must not exceed monthlyLimitCents and must cover the sum of enabled segment daily limits.",
+ "maximum": 9007199254740991,
+ "minimum": 0,
+ "type": "integer"
+ },
+ "endsOn": {
+ "description": "Last included day, on or after startsOn and no later than the end of that same month.",
+ "type": "string"
+ },
+ "monthlyLimitCents": {
+ "description": "Global monthly limit in the same currency; must cover enabled segment monthly limits. Zero is a zero limit.",
+ "maximum": 9007199254740991,
+ "minimum": 0,
+ "type": "integer"
+ },
+ "segments": {
+ "description": "Complete segment configuration, not a partial patch. Preserve unrelated entries; keys and provider/account/campaign identities must be unique. An empty array means no segment allocations.",
+ "items": {
+ "additionalProperties": false,
+ "properties": {
+ "accountRef": {
+ "description": "Existing authorized provider account reference from the current budget/campaign choices, never a credential or inferred account.",
+ "type": "string"
+ },
+ "campaignRefs": {
+ "description": "Distinct campaign references within that provider/account. Each provider/account/campaign identity may appear in only one segment; new references require current authorized choices.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "dailyLimitCents": {
+ "description": "Segment daily limit in integer cents of the budget currency, no higher than its monthly limit; zero is not unlimited.",
+ "maximum": 9007199254740991,
+ "minimum": 0,
+ "type": "integer"
+ },
+ "enabled": {
+ "description": "Whether this segment participates in the active budget allocation; not a provider campaign start/stop command.",
+ "type": "boolean"
+ },
+ "key": {
+ "description": "Stable segment key, unique within this budget; preserve it when changing an existing segment.",
+ "pattern": "^[a-z0-9][a-z0-9_-]{0,59}$",
+ "type": "string"
+ },
+ "label": {
+ "description": "Human-readable segment label; does not select a provider account or campaign.",
+ "type": "string"
+ },
+ "monthlyLimitCents": {
+ "description": "Segment monthly limit in the same currency. Totals of enabled segments must fit within both global limits.",
+ "maximum": 9007199254740991,
+ "minimum": 0,
+ "type": "integer"
+ },
+ "provider": {
+ "description": "Provider namespace of the bound account/campaign references; declaring it does not connect that provider.",
+ "enum": [
+ "google_ads",
+ "microsoft_ads",
+ "openai_ads"
+ ],
+ "type": "string"
+ }
+ },
+ "required": [
+ "key",
+ "label",
+ "provider",
+ "accountRef",
+ "campaignRefs",
+ "enabled",
+ "dailyLimitCents",
+ "monthlyLimitCents"
+ ],
+ "type": "object"
+ },
+ "type": "array"
+ },
+ "startsOn": {
+ "description": "First included budget day, YYYY-MM-DD; must be the first day of the selected calendar month.",
+ "type": "string"
+ },
+ "timeZone": {
+ "description": "Valid IANA time-zone identifier for this budget's calendar; preserve the current setting unless explicitly requested to change it.",
+ "type": "string"
+ }
+ },
+ "required": [
+ "startsOn",
+ "endsOn",
+ "currency",
+ "timeZone",
+ "dailyLimitCents",
+ "monthlyLimitCents",
+ "segments"
+ ],
+ "type": "object"
+ }
+ },
+ "required": [
+ "status",
+ "proposalId",
+ "value",
+ "expiresAt"
+ ],
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "providerWrites": {
+ "const": false,
+ "type": "boolean"
+ },
+ "revision": {
+ "type": "string"
+ },
+ "status": {
+ "enum": [
+ "proposed",
+ "unconfirmed",
+ "changed",
+ "scheduled",
+ "expired",
+ "confirmed",
+ "unavailable"
+ ],
+ "type": "string"
+ },
+ "value": {
+ "anyOf": [
+ {
+ "additionalProperties": false,
+ "properties": {
+ "currency": {
+ "description": "ISO-4217 budget currency. The current shared executable budget contract accepts EUR only; no exchange conversion is performed.",
+ "type": "string"
+ },
+ "dailyLimitCents": {
+ "description": "Global daily limit in integer cents of currency; must not exceed monthlyLimitCents and must cover the sum of enabled segment daily limits.",
+ "maximum": 9007199254740991,
+ "minimum": 0,
+ "type": "integer"
+ },
+ "endsOn": {
+ "description": "Last included day, on or after startsOn and no later than the end of that same month.",
+ "type": "string"
+ },
+ "monthlyLimitCents": {
+ "description": "Global monthly limit in the same currency; must cover enabled segment monthly limits. Zero is a zero limit.",
+ "maximum": 9007199254740991,
+ "minimum": 0,
+ "type": "integer"
+ },
+ "segments": {
+ "description": "Complete segment configuration, not a partial patch. Preserve unrelated entries; keys and provider/account/campaign identities must be unique. An empty array means no segment allocations.",
+ "items": {
+ "additionalProperties": false,
+ "properties": {
+ "accountRef": {
+ "description": "Existing authorized provider account reference from the current budget/campaign choices, never a credential or inferred account.",
+ "type": "string"
+ },
+ "campaignRefs": {
+ "description": "Distinct campaign references within that provider/account. Each provider/account/campaign identity may appear in only one segment; new references require current authorized choices.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "dailyLimitCents": {
+ "description": "Segment daily limit in integer cents of the budget currency, no higher than its monthly limit; zero is not unlimited.",
+ "maximum": 9007199254740991,
+ "minimum": 0,
+ "type": "integer"
+ },
+ "enabled": {
+ "description": "Whether this segment participates in the active budget allocation; not a provider campaign start/stop command.",
+ "type": "boolean"
+ },
+ "key": {
+ "description": "Stable segment key, unique within this budget; preserve it when changing an existing segment.",
+ "pattern": "^[a-z0-9][a-z0-9_-]{0,59}$",
+ "type": "string"
+ },
+ "label": {
+ "description": "Human-readable segment label; does not select a provider account or campaign.",
+ "type": "string"
+ },
+ "monthlyLimitCents": {
+ "description": "Segment monthly limit in the same currency. Totals of enabled segments must fit within both global limits.",
+ "maximum": 9007199254740991,
+ "minimum": 0,
+ "type": "integer"
+ },
+ "provider": {
+ "description": "Provider namespace of the bound account/campaign references; declaring it does not connect that provider.",
+ "enum": [
+ "google_ads",
+ "microsoft_ads",
+ "openai_ads"
+ ],
+ "type": "string"
+ }
+ },
+ "required": [
+ "key",
+ "label",
+ "provider",
+ "accountRef",
+ "campaignRefs",
+ "enabled",
+ "dailyLimitCents",
+ "monthlyLimitCents"
+ ],
+ "type": "object"
+ },
+ "type": "array"
+ },
+ "startsOn": {
+ "description": "First included budget day, YYYY-MM-DD; must be the first day of the selected calendar month.",
+ "type": "string"
+ },
+ "timeZone": {
+ "description": "Valid IANA time-zone identifier for this budget's calendar; preserve the current setting unless explicitly requested to change it.",
+ "type": "string"
+ }
+ },
+ "required": [
+ "startsOn",
+ "endsOn",
+ "currency",
+ "timeZone",
+ "dailyLimitCents",
+ "monthlyLimitCents",
+ "segments"
+ ],
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ }
+ },
+ "required": [
+ "status",
+ "providerWrites"
+ ],
+ "type": "object"
+ },
+ "budgetQuestionStatus": {
+ "description": "Independent question-section availability; unavailable retains budgetQuestions=null.",
+ "enum": [
+ "ok",
+ "unavailable"
+ ],
+ "type": "string"
+ },
+ "budgetQuestions": {
+ "anyOf": [
+ {
+ "items": {
+ "additionalProperties": {},
+ "properties": {
+ "allocationId": {},
+ "budgetId": {},
+ "occurredAt": {
+ "type": "string"
+ },
+ "policy": {
+ "description": "Recorded policy reference, normally moduleKey/policyKey/version/evidenceKey/snapshotHash. Historical fields remain unchanged."
+ },
+ "question": {
+ "description": "Recorded question text; historical journal payloads are retained without reinterpretation."
+ },
+ "questionId": {
+ "type": "string"
+ },
+ "sourceRoleKey": {},
+ "sourceTitle": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "spendEventId": {},
+ "targetRoleKey": {},
+ "targetTitle": {
+ "type": [
+ "string",
+ "null"
+ ]
+ }
+ },
+ "required": [
+ "questionId",
+ "occurredAt",
+ "sourceTitle",
+ "targetTitle"
+ ],
+ "type": "object"
+ },
+ "type": "array"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "budgets": {
+ "description": "Exact reads contain only status and budgets, including archived frames; an absent ID returns an empty array.",
+ "items": {
+ "additionalProperties": false,
+ "description": "General frame with current revision and recorded consumption. Null consumption is unknown; recorded zero does not attest full coverage. Archived frames retain history and cannot fund new spending.",
+ "properties": {
+ "budgetId": {
+ "type": "string"
+ },
+ "currencyCode": {
+ "description": "Stored currency; null means unknown, without an assumed EUR conversion.",
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "endsOn": {
+ "type": "string"
+ },
+ "goal": {
+ "type": "string"
+ },
+ "lifecycleStatus": {
+ "enum": [
+ "active",
+ "archived"
+ ],
+ "type": "string"
+ },
+ "limitCents": {
+ "type": "number"
+ },
+ "limitLabel": {
+ "type": "string"
+ },
+ "periodLabel": {
+ "type": "string"
+ },
+ "reachKey": {
+ "type": "string"
+ },
+ "reachLabel": {
+ "type": "string"
+ },
+ "revision": {
+ "type": "string"
+ },
+ "spentCents": {
+ "type": [
+ "number",
+ "null"
+ ]
+ },
+ "spentLabel": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "startsOn": {
+ "type": "string"
+ },
+ "withinLimit": {
+ "type": [
+ "boolean",
+ "null"
+ ]
+ }
+ },
+ "required": [
+ "budgetId",
+ "revision",
+ "lifecycleStatus",
+ "goal",
+ "reachKey",
+ "reachLabel",
+ "startsOn",
+ "endsOn",
+ "currencyCode",
+ "periodLabel",
+ "limitLabel",
+ "spentLabel",
+ "limitCents",
+ "spentCents",
+ "withinLimit"
+ ],
+ "type": "object"
+ },
+ "type": "array"
+ },
+ "expiresAt": {
+ "description": "Original stored request deadline in private FULL proposal mode; reading never renews it.",
+ "type": "string"
+ },
+ "pending": {
+ "anyOf": [
+ {
+ "additionalProperties": false,
+ "properties": {
+ "goal": {
+ "type": "string"
+ },
+ "limitLabel": {
+ "type": "string"
+ },
+ "periodLabel": {
+ "type": "string"
+ },
+ "proposalId": {
+ "type": "string"
+ },
+ "reachLabel": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "proposalId",
+ "goal",
+ "reachLabel",
+ "limitLabel",
+ "periodLabel"
+ ],
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "description": "Latest General request summary, not a human-card continuation."
+ },
+ "proposalId": {
+ "type": "string"
+ },
+ "reason": {
+ "type": "string"
+ },
+ "roleBudgetStatus": {
+ "description": "Independent role-section availability; unavailable retains roleBudgets=null.",
+ "enum": [
+ "ok",
+ "unavailable"
+ ],
+ "type": "string"
+ },
+ "roleBudgets": {
+ "anyOf": [
+ {
+ "items": {
+ "additionalProperties": false,
+ "description": "Role share; consumption includes descendants. Unassigned historical spending remains in company totals.",
+ "properties": {
+ "allocationId": {
+ "type": "string"
+ },
+ "budgetId": {
+ "type": "string"
+ },
+ "coverage": {
+ "const": "recorded_role_spend_only",
+ "type": "string"
+ },
+ "endsOn": {
+ "type": "string"
+ },
+ "limitCents": {
+ "type": "number"
+ },
+ "limitLabel": {
+ "type": "string"
+ },
+ "parentAllocationId": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "periodLabel": {
+ "type": "string"
+ },
+ "reachKey": {
+ "type": "string"
+ },
+ "reachLabel": {
+ "type": "string"
+ },
+ "remainingCents": {
+ "type": "number"
+ },
+ "remainingLabel": {
+ "type": "string"
+ },
+ "roleKey": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "roleTitle": {
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "spentCents": {
+ "type": "number"
+ },
+ "spentLabel": {
+ "type": "string"
+ },
+ "startsOn": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "allocationId",
+ "budgetId",
+ "parentAllocationId",
+ "roleKey",
+ "roleTitle",
+ "reachKey",
+ "reachLabel",
+ "startsOn",
+ "endsOn",
+ "periodLabel",
+ "limitCents",
+ "spentCents",
+ "remainingCents",
+ "limitLabel",
+ "spentLabel",
+ "remainingLabel",
+ "coverage"
+ ],
+ "type": "object"
+ },
+ "type": "array"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "status": {
+ "description": "ok confirms this read only. Request statuses belong to the private FULL proposalId mode, not current budget state.",
+ "enum": [
+ "ok",
+ "unavailable",
+ "pending_owner",
+ "approved",
+ "expired",
+ "not_found"
+ ],
+ "type": "string"
+ },
+ "suggestion": {
+ "anyOf": [
+ {
+ "additionalProperties": false,
+ "properties": {
+ "confirmed": {
+ "const": false,
+ "type": "boolean"
+ },
+ "label": {
+ "type": "string"
+ },
+ "limitCents": {
+ "type": "number"
+ },
+ "sentence": {
+ "type": "string"
+ },
+ "status": {
+ "const": "suggested",
+ "type": "string"
+ }
+ },
+ "required": [
+ "limitCents",
+ "label",
+ "sentence",
+ "status",
+ "confirmed"
+ ],
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "description": "Unconfirmed recommendation, never an active limit."
+ }
+ },
+ "required": [
+ "status"
+ ],
+ "type": "object"
+}