{ "$schema": "https://json-schema.org/draft/2020-12/schema", "$id": "https://raw.githubusercontent.com/api-evangelist/plainrouter/main/json-schema/plainrouter-action-proposal-read-schema.json", "title": "ActionProposalRead", "x-generated": "2026-10-18", "x-method": "derived", "x-generator": "derive-json-schema.py", "x-source": "openapi/plainrouter-openapi.json#/components/schemas/ActionProposalRead", "type": "object", "properties": { "proposal": { "type": "object", "description": "Complete projection rows are paged within 80,000 JSON bytes, accounting for both MCP representations. Defaults are bounded. Follow next_cursor with the same scope and filters. One oversized row is explicitly refused; fields are never silently clipped.", "properties": { "id": { "type": "string" }, "scope": {}, "evidence_provenance": {}, "status": { "type": "string", "enum": [ "pending", "approved", "approved_without_execution", "auto_approved", "rejected", "executing", "executed_pending_verification", "compensating", "measuring", "completed", "failed", "rolled_back", "rollback_incomplete", "blocked", "halted" ] }, "policy_decision": { "type": "string", "enum": [ "allow", "require_approval", "block" ] }, "policy_reasons": { "type": "array", "items": { "type": "string" } }, "approval_required": { "type": "boolean" }, "inbox_url": { "type": "string" }, "approval_queue_url": { "type": "string" }, "rationale": { "type": "string" }, "proposed_by": { "type": "object", "properties": { "type": { "type": "string" }, "id": { "type": "string" }, "name": { "type": [ "string", "null" ] } }, "required": [ "type", "id", "name" ] }, "actions": { "type": "array", "items": { "type": "object", "properties": { "id": { "type": "string" }, "type": { "type": "string", "enum": [ "increase_budget", "decrease_budget", "pause", "resume", "replace_creative", "shift_spend", "rollback", "create_campaign", "create_ad_set", "create_ad", "upload_asset", "adjust_budget", "set_status", "duplicate_ad_with_creative", "duplicate_adset", "duplicate_ad_with_creative_v2" ] }, "target_entity": { "type": "object", "properties": { "type": { "type": "string" }, "id": { "type": "string" }, "name": { "type": [ "string", "null" ] } }, "required": [ "type", "id", "name" ] }, "params": { "anyOf": [ { "type": "object", "additionalProperties": {} }, { "type": "array", "items": {} } ] }, "rationale": { "type": "string" }, "proposed_by": { "type": "object", "properties": { "type": { "type": "string" }, "id": { "type": "string" }, "name": { "type": [ "string", "null" ] } }, "required": [ "type", "id", "name" ] }, "policy_decision": { "type": "string", "enum": [ "allow", "require_approval", "block" ] }, "policy_reasons": { "type": "array", "items": { "type": "string" } }, "policy_evidence": {} }, "required": [ "id", "type", "target_entity", "params", "rationale", "proposed_by", "policy_decision", "policy_reasons", "policy_evidence" ] } }, "next_cursor": { "type": [ "integer", "null" ] }, "truncated": { "type": "boolean" }, "continuation": { "type": "string" }, "total": { "type": "integer" } }, "required": [ "id", "scope", "evidence_provenance", "status", "policy_decision", "policy_reasons", "approval_required", "inbox_url", "approval_queue_url", "rationale", "proposed_by", "actions" ] } }, "required": [ "proposal" ] }