Files
EvoFirewall/docs/openapi.schemas.json
Denozordec 9fa6269174
quality / changes (push) Successful in 7s
quality / commitlint (push) Skipped
quality / openapi (push) Successful in 30s
quality / web (push) Successful in 1m3s
quality / api (push) Successful in 1m15s
quality / linux-agent-smoke (push) Failing after 27s
quality / docker-check (push) Failing after 2m28s
CD / quality (push) Failing after 5m52s
CD / publish (push) Skipped
feat: harden firewall policies telemetry and operations
Implement reliable agent apply, telemetry v2, analytics retention, guarded rollouts, enrollment, labels and webhooks. Improve ReUI frontend data safety and bounded list loading, and add Docker smoke, recovery and resource checks. Document local verification and pending native acceptance.
2026-10-26 13:10:58 +07:00

3720 lines
100 KiB
JSON

{
"x-generated-by": "scripts/ci/generate-openapi-schemas.mjs; rebuild @evofw/shared first",
"components": {
"schemas": {
"Agent": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
},
"hostname": {
"nullable": true,
"type": "string"
},
"platform": {
"type": "string",
"enum": [
"linux",
"mikrotik"
]
},
"token_prefix": {
"type": "string"
},
"status": {
"type": "string",
"enum": [
"invited",
"pending",
"approved",
"revoked"
]
},
"default_action": {
"type": "string",
"enum": [
"accept",
"drop"
]
},
"policy_mode": {
"type": "string",
"enum": [
"blacklist",
"whitelist"
]
},
"policy_generation": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"last_seen_at": {
"nullable": true,
"type": "string"
},
"last_seen_ip": {
"nullable": true,
"type": "string"
},
"last_apply_at": {
"nullable": true,
"type": "string"
},
"last_apply_status": {
"nullable": true,
"type": "string"
},
"last_apply_error": {
"nullable": true,
"type": "string"
},
"last_apply_prefix_count": {
"nullable": true,
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"last_apply_packets_dropped": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"last_apply_packets_accepted": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"total_packets_dropped": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"total_packets_accepted": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"last_apply_kernel_method": {
"nullable": true,
"type": "string"
},
"client_version": {
"nullable": true,
"type": "string"
},
"settings_json": {
"type": "string"
},
"created_at": {
"type": "string"
},
"approved_at": {
"nullable": true,
"type": "string"
},
"revoked_at": {
"nullable": true,
"type": "string"
},
"install_curl": {
"nullable": true,
"type": "string"
},
"install_link_id": {
"nullable": true,
"type": "string"
},
"diagnostics": {
"type": "object",
"properties": {
"desired_revision": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"desired_hash": {
"nullable": true,
"type": "string"
},
"applied_revision": {
"nullable": true,
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"applied_hash": {
"nullable": true,
"type": "string"
},
"agent_version": {
"nullable": true,
"type": "string"
},
"capabilities": {
"type": "array",
"items": {
"type": "string"
}
},
"last_contact_at": {
"nullable": true,
"type": "string"
},
"last_telemetry_at": {
"nullable": true,
"type": "string"
},
"last_apply_at": {
"nullable": true,
"type": "string"
},
"apply_error": {
"nullable": true,
"type": "object",
"properties": {
"code": {
"type": "string",
"minLength": 1,
"maxLength": 128
},
"message": {
"type": "string",
"minLength": 1,
"maxLength": 2048
},
"stage": {
"type": "string",
"maxLength": 128
},
"retryable": {
"type": "boolean"
}
},
"required": [
"code",
"message"
]
},
"status": {
"type": "string",
"enum": [
"pending",
"applying",
"in_sync",
"failed",
"drift",
"unsupported"
]
},
"telemetry_version": {
"nullable": true,
"type": "number"
},
"quality": {
"type": "object",
"properties": {
"partial": {
"type": "boolean"
},
"truncated": {
"type": "boolean"
},
"unsupported": {
"maxItems": 64,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 128
}
},
"lost_reports": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"partial",
"truncated",
"unsupported",
"lost_reports"
]
},
"detail_counts": {
"nullable": true,
"type": "object",
"properties": {
"ip_found": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"ip_sent": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"port_found": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"port_sent": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"ip_found",
"ip_sent",
"port_found",
"port_sent"
]
}
},
"required": [
"desired_revision",
"desired_hash",
"applied_revision",
"applied_hash",
"agent_version",
"capabilities",
"last_contact_at",
"last_telemetry_at",
"last_apply_at",
"apply_error",
"status",
"telemetry_version",
"quality"
]
}
},
"required": [
"id",
"name",
"platform",
"token_prefix",
"status",
"default_action",
"policy_generation",
"created_at"
]
},
"AgentDiagnostics": {
"type": "object",
"properties": {
"desired_revision": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"desired_hash": {
"nullable": true,
"type": "string"
},
"applied_revision": {
"nullable": true,
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"applied_hash": {
"nullable": true,
"type": "string"
},
"agent_version": {
"nullable": true,
"type": "string"
},
"capabilities": {
"type": "array",
"items": {
"type": "string"
}
},
"last_contact_at": {
"nullable": true,
"type": "string"
},
"last_telemetry_at": {
"nullable": true,
"type": "string"
},
"last_apply_at": {
"nullable": true,
"type": "string"
},
"apply_error": {
"nullable": true,
"type": "object",
"properties": {
"code": {
"type": "string",
"minLength": 1,
"maxLength": 128
},
"message": {
"type": "string",
"minLength": 1,
"maxLength": 2048
},
"stage": {
"type": "string",
"maxLength": 128
},
"retryable": {
"type": "boolean"
}
},
"required": [
"code",
"message"
]
},
"status": {
"type": "string",
"enum": [
"pending",
"applying",
"in_sync",
"failed",
"drift",
"unsupported"
]
},
"telemetry_version": {
"nullable": true,
"type": "number"
},
"quality": {
"type": "object",
"properties": {
"partial": {
"type": "boolean"
},
"truncated": {
"type": "boolean"
},
"unsupported": {
"maxItems": 64,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 128
}
},
"lost_reports": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"partial",
"truncated",
"unsupported",
"lost_reports"
]
},
"detail_counts": {
"nullable": true,
"type": "object",
"properties": {
"ip_found": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"ip_sent": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"port_found": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"port_sent": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"ip_found",
"ip_sent",
"port_found",
"port_sent"
]
}
},
"required": [
"desired_revision",
"desired_hash",
"applied_revision",
"applied_hash",
"agent_version",
"capabilities",
"last_contact_at",
"last_telemetry_at",
"last_apply_at",
"apply_error",
"status",
"telemetry_version",
"quality"
]
},
"AgentPolicy": {
"type": "object",
"properties": {
"generation": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"hash": {
"type": "string"
},
"apply_version": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"default_action": {
"type": "string",
"enum": [
"accept",
"drop"
]
},
"policy_mode": {
"type": "string",
"enum": [
"blacklist",
"whitelist"
]
},
"deny_cidrs": {
"type": "array",
"items": {
"type": "string"
}
},
"allow_cidrs": {
"type": "array",
"items": {
"type": "string"
}
},
"port_rules": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"action": {
"type": "string",
"enum": [
"open",
"close"
]
},
"protocol": {
"type": "string",
"enum": [
"tcp",
"udp"
]
},
"port_start": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"port_end": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"src_cidrs": {
"type": "array",
"items": {
"type": "string"
}
}
},
"required": [
"id",
"action",
"protocol",
"port_start",
"port_end",
"src_cidrs"
]
}
},
"sync_interval_sec": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"script_sha256": {
"type": "string"
}
},
"required": [
"generation",
"hash",
"apply_version",
"default_action",
"deny_cidrs",
"allow_cidrs",
"sync_interval_sec"
]
},
"ApplyReport": {
"anyOf": [
{
"type": "object",
"properties": {
"status": {
"type": "string"
},
"prefix_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"packets_dropped": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"packets_accepted": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"kernel_method": {
"type": "string"
},
"error": {
"type": "string",
"maxLength": 2048
},
"apply_error": {
"nullable": true,
"type": "object",
"properties": {
"code": {
"type": "string",
"minLength": 1,
"maxLength": 128
},
"message": {
"type": "string",
"minLength": 1,
"maxLength": 2048
},
"stage": {
"type": "string",
"maxLength": 128
},
"retryable": {
"type": "boolean"
}
},
"required": [
"code",
"message"
]
},
"source": {
"type": "string"
},
"ip_hits": {
"maxItems": 200,
"type": "array",
"items": {
"type": "object",
"properties": {
"ip": {
"anyOf": [
{
"type": "string"
},
{
"type": "string"
}
]
},
"packets": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"ip",
"packets"
]
}
},
"port_hits": {
"maxItems": 500,
"type": "array",
"items": {
"type": "object",
"properties": {
"ip": {
"type": "string"
},
"port": {
"type": "integer",
"minimum": 1,
"maximum": 65535
},
"protocol": {
"type": "string",
"enum": [
"tcp",
"udp"
]
},
"packets": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"ip",
"port",
"protocol",
"packets"
]
}
},
"host_firewall": {
"type": "object",
"properties": {
"rules": {
"default": [],
"maxItems": 500,
"type": "array",
"items": {}
},
"listeners": {
"default": [],
"maxItems": 200,
"type": "array",
"items": {}
}
}
},
"telemetry_version": {
"type": "number",
"enum": [
2
]
},
"report_id": {
"type": "string",
"minLength": 1,
"maxLength": 128
},
"sequence": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"boot_id": {
"type": "string",
"minLength": 1,
"maxLength": 128
},
"observed_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"interval_ms": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"counter_epoch": {
"type": "object",
"properties": {
"traffic": {
"type": "string",
"minLength": 1,
"maxLength": 128
},
"ip": {
"type": "string",
"minLength": 1,
"maxLength": 128
},
"port": {
"type": "string",
"minLength": 1,
"maxLength": 128
}
},
"required": [
"traffic"
]
},
"applied_hash": {
"type": "string",
"pattern": "^sha256:[0-9a-f]{64}$"
},
"applied_revision": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"agent_version": {
"type": "string",
"minLength": 1,
"maxLength": 128
},
"capabilities": {
"maxItems": 64,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 128
}
},
"quality": {
"type": "object",
"properties": {
"partial": {
"type": "boolean"
},
"truncated": {
"type": "boolean"
},
"unsupported": {
"maxItems": 64,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 128
}
},
"lost_reports": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"partial",
"truncated",
"unsupported",
"lost_reports"
]
},
"detail_counts": {
"type": "object",
"properties": {
"ip_found": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"ip_sent": {
"type": "integer",
"minimum": 0,
"maximum": 200
},
"port_found": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"port_sent": {
"type": "integer",
"minimum": 0,
"maximum": 500
}
},
"required": [
"ip_found",
"ip_sent",
"port_found",
"port_sent"
]
}
},
"required": [
"status",
"telemetry_version",
"report_id",
"sequence",
"boot_id",
"observed_at",
"interval_ms",
"counter_epoch",
"capabilities",
"quality"
]
},
{
"type": "object",
"properties": {
"status": {
"type": "string"
},
"prefix_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"packets_dropped": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"packets_accepted": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"kernel_method": {
"type": "string"
},
"error": {
"type": "string",
"maxLength": 2048
},
"apply_error": {
"nullable": true,
"type": "object",
"properties": {
"code": {
"type": "string",
"minLength": 1,
"maxLength": 128
},
"message": {
"type": "string",
"minLength": 1,
"maxLength": 2048
},
"stage": {
"type": "string",
"maxLength": 128
},
"retryable": {
"type": "boolean"
}
},
"required": [
"code",
"message"
]
},
"source": {
"type": "string"
},
"ip_hits": {
"maxItems": 200,
"type": "array",
"items": {
"type": "object",
"properties": {
"ip": {
"anyOf": [
{
"type": "string"
},
{
"type": "string"
}
]
},
"packets": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"ip",
"packets"
]
}
},
"port_hits": {
"maxItems": 500,
"type": "array",
"items": {
"type": "object",
"properties": {
"ip": {
"type": "string"
},
"port": {
"type": "integer",
"minimum": 1,
"maximum": 65535
},
"protocol": {
"type": "string",
"enum": [
"tcp",
"udp"
]
},
"packets": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"ip",
"port",
"protocol",
"packets"
]
}
},
"host_firewall": {
"type": "object",
"properties": {
"rules": {
"default": [],
"maxItems": 500,
"type": "array",
"items": {}
},
"listeners": {
"default": [],
"maxItems": 200,
"type": "array",
"items": {}
}
}
},
"telemetry_version": {
"type": "number",
"enum": [
1
]
}
},
"required": [
"status"
]
}
]
},
"ApplyReportV2": {
"type": "object",
"properties": {
"status": {
"type": "string"
},
"prefix_count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"packets_dropped": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"packets_accepted": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"kernel_method": {
"type": "string"
},
"error": {
"type": "string",
"maxLength": 2048
},
"apply_error": {
"nullable": true,
"type": "object",
"properties": {
"code": {
"type": "string",
"minLength": 1,
"maxLength": 128
},
"message": {
"type": "string",
"minLength": 1,
"maxLength": 2048
},
"stage": {
"type": "string",
"maxLength": 128
},
"retryable": {
"type": "boolean"
}
},
"required": [
"code",
"message"
]
},
"source": {
"type": "string"
},
"ip_hits": {
"maxItems": 200,
"type": "array",
"items": {
"type": "object",
"properties": {
"ip": {
"anyOf": [
{
"type": "string"
},
{
"type": "string"
}
]
},
"packets": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"ip",
"packets"
]
}
},
"port_hits": {
"maxItems": 500,
"type": "array",
"items": {
"type": "object",
"properties": {
"ip": {
"type": "string"
},
"port": {
"type": "integer",
"minimum": 1,
"maximum": 65535
},
"protocol": {
"type": "string",
"enum": [
"tcp",
"udp"
]
},
"packets": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"ip",
"port",
"protocol",
"packets"
]
}
},
"host_firewall": {
"type": "object",
"properties": {
"rules": {
"default": [],
"maxItems": 500,
"type": "array",
"items": {}
},
"listeners": {
"default": [],
"maxItems": 200,
"type": "array",
"items": {}
}
}
},
"telemetry_version": {
"type": "number",
"enum": [
2
]
},
"report_id": {
"type": "string",
"minLength": 1,
"maxLength": 128
},
"sequence": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"boot_id": {
"type": "string",
"minLength": 1,
"maxLength": 128
},
"observed_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"interval_ms": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"counter_epoch": {
"type": "object",
"properties": {
"traffic": {
"type": "string",
"minLength": 1,
"maxLength": 128
},
"ip": {
"type": "string",
"minLength": 1,
"maxLength": 128
},
"port": {
"type": "string",
"minLength": 1,
"maxLength": 128
}
},
"required": [
"traffic"
]
},
"applied_hash": {
"type": "string",
"pattern": "^sha256:[0-9a-f]{64}$"
},
"applied_revision": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"agent_version": {
"type": "string",
"minLength": 1,
"maxLength": 128
},
"capabilities": {
"maxItems": 64,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 128
}
},
"quality": {
"type": "object",
"properties": {
"partial": {
"type": "boolean"
},
"truncated": {
"type": "boolean"
},
"unsupported": {
"maxItems": 64,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 128
}
},
"lost_reports": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"partial",
"truncated",
"unsupported",
"lost_reports"
]
},
"detail_counts": {
"type": "object",
"properties": {
"ip_found": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"ip_sent": {
"type": "integer",
"minimum": 0,
"maximum": 200
},
"port_found": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"port_sent": {
"type": "integer",
"minimum": 0,
"maximum": 500
}
},
"required": [
"ip_found",
"ip_sent",
"port_found",
"port_sent"
]
}
},
"required": [
"status",
"telemetry_version",
"report_id",
"sequence",
"boot_id",
"observed_at",
"interval_ms",
"counter_epoch",
"capabilities",
"quality"
]
},
"TelemetryQuality": {
"type": "object",
"properties": {
"partial": {
"type": "boolean"
},
"truncated": {
"type": "boolean"
},
"unsupported": {
"maxItems": 64,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 128
}
},
"lost_reports": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"partial",
"truncated",
"unsupported",
"lost_reports"
]
},
"ApplyError": {
"type": "object",
"properties": {
"code": {
"type": "string",
"minLength": 1,
"maxLength": 128
},
"message": {
"type": "string",
"minLength": 1,
"maxLength": 2048
},
"stage": {
"type": "string",
"maxLength": 128
},
"retryable": {
"type": "boolean"
}
},
"required": [
"code",
"message"
]
},
"TimeseriesResponse": {
"type": "object",
"properties": {
"from": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
},
"to": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
},
"resolution": {
"type": "string",
"enum": [
"1m",
"1h",
"1d"
]
},
"items": {
"maxItems": 1440,
"type": "array",
"items": {
"type": "object",
"properties": {
"timestamp": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
},
"packets_dropped": {
"nullable": true,
"type": "number",
"minimum": 0
},
"packets_accepted": {
"nullable": true,
"type": "number",
"minimum": 0
},
"pps": {
"nullable": true,
"type": "number",
"minimum": 0
},
"coverage": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"estimated": {
"type": "boolean"
},
"quality": {
"type": "object",
"properties": {
"partial": {
"type": "boolean"
},
"truncated": {
"type": "boolean"
},
"unsupported": {
"maxItems": 64,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 128
}
},
"lost_reports": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"partial",
"truncated",
"unsupported",
"lost_reports"
]
}
},
"required": [
"timestamp",
"packets_dropped",
"packets_accepted",
"pps",
"coverage",
"estimated",
"quality"
]
}
},
"agent_ids": {
"maxItems": 100,
"type": "array",
"items": {
"type": "string"
}
}
},
"required": [
"from",
"to",
"resolution",
"items",
"agent_ids"
]
},
"UiSummary": {
"type": "object",
"properties": {
"updated_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
},
"dashboard": {
"type": "object",
"properties": {
"agents_total": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"agents_approved": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"agents_online": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"agents_pending": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"packets_dropped": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"packets_accepted": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"lists_total": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"agents_total",
"agents_approved",
"agents_online",
"agents_pending",
"packets_dropped",
"packets_accepted",
"lists_total"
]
},
"agents": {
"type": "object",
"properties": {
"approved": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"online": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"pending": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"offline": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"approved",
"online",
"pending",
"offline"
]
},
"lists": {
"type": "object",
"properties": {
"total": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"failed": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"total",
"failed"
]
},
"policies": {
"type": "object",
"properties": {
"sets_total": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"rules_total": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"sets_total",
"rules_total"
]
}
},
"required": [
"updated_at"
]
},
"ExplainResponse": {
"type": "object",
"properties": {
"agent_id": {
"type": "string"
},
"query": {
"type": "object",
"properties": {
"ip": {
"type": "string"
},
"protocol": {
"nullable": true,
"type": "string",
"enum": [
"tcp",
"udp"
]
},
"port": {
"nullable": true,
"type": "number"
},
"chain": {
"type": "string",
"enum": [
"input",
"forward"
]
},
"dnat": {
"type": "boolean"
},
"connection_state": {
"type": "string",
"enum": [
"new",
"established",
"related"
]
}
},
"required": [
"ip",
"protocol",
"port",
"chain",
"dnat",
"connection_state"
]
},
"desired": {
"type": "object",
"properties": {
"revision": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"hash": {
"type": "string"
},
"decision": {
"nullable": true,
"type": "string",
"enum": [
"accept",
"drop"
]
},
"stage": {
"type": "string",
"enum": [
"stateful",
"deny",
"port_close",
"port_open",
"port_implicit_close",
"allow",
"default",
"external",
"unsupported",
"transport_unknown"
]
},
"match": {
"nullable": true,
"type": "object",
"properties": {
"rule_id": {
"nullable": true,
"type": "string"
},
"set_id": {
"nullable": true,
"type": "string"
},
"list_id": {
"nullable": true,
"type": "string"
},
"override_id": {
"nullable": true,
"type": "string"
},
"cidr": {
"nullable": true,
"type": "string"
},
"label": {
"type": "string"
},
"stage": {
"type": "string",
"enum": [
"stateful",
"deny",
"port_close",
"port_open",
"port_implicit_close",
"allow",
"default",
"external",
"unsupported",
"transport_unknown"
]
}
},
"required": [
"rule_id",
"set_id",
"list_id",
"override_id",
"cidr",
"label",
"stage"
]
}
},
"required": [
"revision",
"hash",
"decision",
"stage",
"match"
]
},
"applied": {
"type": "object",
"properties": {
"revision": {
"nullable": true,
"type": "number"
},
"hash": {
"nullable": true,
"type": "string"
},
"same_as_desired": {
"nullable": true,
"type": "boolean"
},
"status": {
"type": "string",
"enum": [
"pending",
"applying",
"in_sync",
"failed",
"drift",
"unsupported"
]
}
},
"required": [
"revision",
"hash",
"same_as_desired",
"status"
]
},
"matches": {
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"rule_id": {
"nullable": true,
"type": "string"
},
"set_id": {
"nullable": true,
"type": "string"
},
"list_id": {
"nullable": true,
"type": "string"
},
"override_id": {
"nullable": true,
"type": "string"
},
"cidr": {
"nullable": true,
"type": "string"
},
"label": {
"type": "string"
},
"stage": {
"type": "string",
"enum": [
"stateful",
"deny",
"port_close",
"port_open",
"port_implicit_close",
"allow",
"default",
"external",
"unsupported",
"transport_unknown"
]
}
},
"required": [
"rule_id",
"set_id",
"list_id",
"override_id",
"cidr",
"label",
"stage"
]
}
},
"matches_total": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"truncated": {
"type": "boolean"
},
"limits": {
"type": "array",
"items": {
"type": "string"
}
},
"external_firewall": {
"type": "object",
"properties": {
"observed_at": {
"nullable": true,
"type": "string"
},
"rule_count": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"complete": {
"type": "boolean",
"enum": [
false
]
}
},
"required": [
"observed_at",
"rule_count",
"complete"
]
}
},
"required": [
"agent_id",
"query",
"desired",
"applied",
"matches",
"matches_total",
"truncated",
"limits",
"external_firewall"
]
},
"CreateOverride": {
"type": "object",
"properties": {
"cidr": {
"type": "string"
},
"action": {
"type": "string",
"enum": [
"allow",
"deny"
]
},
"comment": {
"nullable": true,
"type": "string"
},
"reason": {
"type": "string",
"minLength": 1,
"maxLength": 1024
},
"expires_at": {
"nullable": true,
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"ttl_seconds": {
"type": "integer",
"minimum": 60,
"maximum": 2592000
}
},
"required": [
"cidr",
"action"
]
},
"IpOverride": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"agent_id": {
"type": "string"
},
"cidr": {
"type": "string"
},
"action": {
"type": "string",
"enum": [
"allow",
"deny"
]
},
"comment": {
"nullable": true,
"type": "string"
},
"created_at": {
"type": "string"
},
"reason": {
"nullable": true,
"type": "string"
},
"created_by_user_id": {
"nullable": true,
"type": "string"
},
"created_by_name": {
"nullable": true,
"type": "string"
},
"expires_at": {
"nullable": true,
"type": "string"
},
"expired": {
"type": "boolean"
},
"expiration_enforcement": {
"type": "string",
"enum": [
"next_policy_sync"
]
}
},
"required": [
"id",
"agent_id",
"cidr",
"action",
"created_at"
]
},
"IpList": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
},
"type": {
"type": "string",
"enum": [
"static",
"json_url",
"domains",
"evobgp_community"
]
},
"config_json": {
"type": "string"
},
"content_hash": {
"nullable": true,
"type": "string"
},
"refreshed_at": {
"nullable": true,
"type": "string"
},
"last_error": {
"nullable": true,
"type": "string"
},
"entry_count": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"created_at": {
"type": "string"
},
"updated_at": {
"type": "string"
}
},
"required": [
"id",
"name",
"type",
"config_json",
"created_at",
"updated_at"
]
},
"CreateWebhook": {
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1,
"maxLength": 100
},
"url": {
"type": "string",
"maxLength": 2048,
"format": "uri"
},
"secret": {
"type": "string",
"minLength": 32,
"maxLength": 256
},
"events": {
"minItems": 1,
"maxItems": 4,
"type": "array",
"items": {
"type": "string",
"enum": [
"agent.offline",
"agent.apply_failed",
"agent.drift",
"source.error"
]
}
},
"enabled": {
"default": true,
"type": "boolean"
}
},
"required": [
"name",
"url",
"secret",
"events"
],
"additionalProperties": false
},
"PatchWebhook": {
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1,
"maxLength": 100
},
"url": {
"type": "string",
"maxLength": 2048,
"format": "uri"
},
"secret": {
"type": "string",
"minLength": 32,
"maxLength": 256
},
"events": {
"minItems": 1,
"maxItems": 4,
"type": "array",
"items": {
"type": "string",
"enum": [
"agent.offline",
"agent.apply_failed",
"agent.drift",
"source.error"
]
}
},
"enabled": {
"default": true,
"type": "boolean"
}
},
"additionalProperties": false
},
"EnrollWithCredential": {
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1,
"maxLength": 255
},
"hostname": {
"type": "string",
"maxLength": 255
},
"platform": {
"default": "linux",
"type": "string",
"enum": [
"linux",
"mikrotik"
]
},
"token": {
"type": "string",
"minLength": 16,
"maxLength": 256
},
"client_version": {
"type": "string",
"maxLength": 100
},
"install_link_id": {
"type": "string",
"minLength": 8,
"maxLength": 128
}
},
"required": [
"name",
"token",
"install_link_id"
],
"additionalProperties": false
},
"TokenRotationExchange": {
"type": "object",
"properties": {
"request_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"next_token": {
"type": "string",
"pattern": "^evofw_[A-Za-z0-9_-]{32,128}$"
}
},
"required": [
"request_id",
"next_token"
],
"additionalProperties": false
},
"CredentialStatus": {
"type": "object",
"properties": {
"client_id": {
"type": "string"
},
"rotation": {
"nullable": true,
"type": "object",
"properties": {
"request_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"expires_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
}
},
"required": [
"request_id",
"expires_at"
]
},
"completed_rotation": {
"nullable": true,
"type": "object",
"properties": {
"request_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
}
},
"required": [
"request_id"
]
}
},
"required": [
"client_id",
"rotation",
"completed_rotation"
]
},
"TokenRotationAck": {
"type": "object",
"properties": {
"ok": {
"type": "boolean",
"enum": [
true
]
},
"request_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"client_id": {
"type": "string"
}
},
"required": [
"ok",
"request_id",
"client_id"
]
},
"AdminCredentialStatus": {
"type": "object",
"properties": {
"agent_id": {
"type": "string"
},
"supported": {
"type": "boolean"
},
"client_version": {
"nullable": true,
"type": "string"
},
"agent_status": {
"type": "string",
"enum": [
"invited",
"pending",
"approved",
"revoked"
]
},
"rotation": {
"nullable": true,
"type": "object",
"properties": {
"request_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"expires_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
}
},
"required": [
"request_id",
"expires_at"
]
},
"completed_rotation": {
"nullable": true,
"type": "object",
"properties": {
"request_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
}
},
"required": [
"request_id"
]
}
},
"required": [
"agent_id",
"supported",
"client_version",
"agent_status",
"rotation",
"completed_rotation"
]
},
"ListImportSummary": {
"type": "object",
"properties": {
"count": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"content_hash": {
"nullable": true,
"type": "string"
},
"changed": {
"type": "boolean"
}
},
"required": [
"count",
"content_hash",
"changed"
],
"additionalProperties": false
},
"CreatePolicySnapshot": {
"type": "object",
"properties": {
"source_agent_id": {
"type": "string",
"minLength": 1,
"maxLength": 128
},
"name": {
"type": "string",
"minLength": 1,
"maxLength": 120
}
},
"required": [
"source_agent_id",
"name"
],
"additionalProperties": false
},
"PolicySnapshotDiffRequest": {
"type": "object",
"properties": {
"agent_ids": {
"minItems": 1,
"maxItems": 100,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 128
}
}
},
"required": [
"agent_ids"
],
"additionalProperties": false
},
"CreatePolicyRollout": {
"type": "object",
"properties": {
"snapshot_id": {
"type": "string",
"minLength": 1,
"maxLength": 128
},
"targets": {
"minItems": 1,
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"agent_id": {
"type": "string",
"minLength": 1,
"maxLength": 128
},
"expected_generation": {
"type": "integer",
"minimum": 0,
"exclusiveMinimum": true,
"maximum": 9007199254740991
}
},
"required": [
"agent_id",
"expected_generation"
],
"additionalProperties": false
}
},
"canary_ids": {
"minItems": 1,
"maxItems": 100,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 128
}
}
},
"required": [
"snapshot_id",
"targets",
"canary_ids"
],
"additionalProperties": false
},
"PolicyRolloutTransition": {
"type": "object",
"properties": {
"expected_version": {
"type": "integer",
"minimum": 0,
"exclusiveMinimum": true,
"maximum": 9007199254740991
}
},
"required": [
"expected_version"
],
"additionalProperties": false
},
"ReleasePolicyPin": {
"type": "object",
"properties": {
"rollout_id": {
"type": "string",
"minLength": 1,
"maxLength": 128
},
"expected_generation": {
"type": "integer",
"minimum": 0,
"exclusiveMinimum": true,
"maximum": 9007199254740991
}
},
"required": [
"rollout_id",
"expected_generation"
],
"additionalProperties": false
},
"CreateAgentLabel": {
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1,
"maxLength": 64
},
"color": {
"nullable": true,
"type": "string",
"enum": [
"primary",
"success",
"warning",
"destructive",
"secondary",
"info"
]
}
},
"required": [
"name"
],
"additionalProperties": false
},
"PatchAgentLabel": {
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1,
"maxLength": 64
},
"color": {
"nullable": true,
"type": "string",
"enum": [
"primary",
"success",
"warning",
"destructive",
"secondary",
"info"
]
}
},
"additionalProperties": false
},
"PutAgentLabels": {
"type": "object",
"properties": {
"label_ids": {
"maxItems": 20,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 128
}
}
},
"required": [
"label_ids"
],
"additionalProperties": false
},
"PreviewLabelAssignment": {
"type": "object",
"properties": {
"selector": {
"type": "object",
"properties": {
"agent_ids": {
"minItems": 1,
"maxItems": 100,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 128
}
},
"label_ids": {
"maxItems": 20,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 128
}
}
},
"additionalProperties": false
},
"mode": {
"type": "string",
"enum": [
"add",
"replace"
]
},
"set_ids": {
"maxItems": 100,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 128
}
}
},
"required": [
"selector",
"mode",
"set_ids"
],
"additionalProperties": false
},
"ApplyLabelAssignment": {
"type": "object",
"properties": {
"selector": {
"type": "object",
"properties": {
"agent_ids": {
"minItems": 1,
"maxItems": 100,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 128
}
},
"label_ids": {
"maxItems": 20,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 128
}
}
},
"additionalProperties": false
},
"mode": {
"type": "string",
"enum": [
"add",
"replace"
]
},
"set_ids": {
"maxItems": 100,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 128
}
},
"expected": {
"minItems": 1,
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"agent_id": {
"type": "string",
"minLength": 1,
"maxLength": 128
},
"generation": {
"type": "integer",
"minimum": 0,
"exclusiveMinimum": true,
"maximum": 9007199254740991
}
},
"required": [
"agent_id",
"generation"
],
"additionalProperties": false
}
}
},
"required": [
"selector",
"mode",
"set_ids",
"expected"
],
"additionalProperties": false
}
}
},
"paths": {
"/v1/agent/credentials": {
"get": {
"summary": "Agent credential status; no-store; approved current token only",
"tags": [
"ops"
],
"security": [
{
"agentToken": []
}
],
"responses": {
"200": {
"description": "Agent credential status; no-store; approved current token only",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/CredentialStatus"
}
}
}
},
"400": {
"description": "Invalid request"
},
"401": {
"description": "Authentication required"
},
"403": {
"description": "Insufficient permission"
},
"409": {
"description": "Stale revision, conflicting operation or resource still referenced"
}
}
}
},
"/v1/agent/token-rotation": {
"post": {
"summary": "Atomic token exchange; old-token retry only for exact completed exchange within 24 hours; no-store",
"tags": [
"ops"
],
"security": [
{
"agentToken": []
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/TokenRotationExchange"
}
}
}
},
"responses": {
"200": {
"description": "Atomic token exchange; old-token retry only for exact completed exchange within 24 hours; no-store",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/TokenRotationAck"
}
}
}
},
"400": {
"description": "Invalid request"
},
"401": {
"description": "Authentication required"
},
"403": {
"description": "Insufficient permission"
},
"409": {
"description": "Stale revision, conflicting operation or resource still referenced"
}
}
}
},
"/api/v1/agents/{id}/token-rotation": {
"parameters": [
{
"name": "id",
"in": "path",
"required": true,
"schema": {
"type": "string",
"minLength": 1,
"maxLength": 128
}
}
],
"get": {
"summary": "Operator credential rotation status; agents read permission; no-store",
"tags": [
"ops"
],
"security": [
{
"bearerAuth": []
}
],
"responses": {
"200": {
"description": "Operator credential rotation status; agents read permission; no-store",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/AdminCredentialStatus"
}
}
}
},
"400": {
"description": "Invalid request"
},
"401": {
"description": "Authentication required"
},
"403": {
"description": "Insufficient permission"
},
"409": {
"description": "Stale revision, conflicting operation or resource still referenced"
}
}
},
"post": {
"summary": "Request rotation for a supported approved client; agents write permission",
"tags": [
"ops"
],
"security": [
{
"bearerAuth": []
}
],
"responses": {
"202": {
"description": "Request rotation for a supported approved client; agents write permission"
},
"400": {
"description": "Invalid request"
},
"401": {
"description": "Authentication required"
},
"403": {
"description": "Insufficient permission"
},
"409": {
"description": "Stale revision, conflicting operation or resource still referenced"
}
}
}
},
"/api/v1/policies/snapshots": {
"get": {
"summary": "List immutable snapshot metadata; policies read permission",
"tags": [
"ops"
],
"security": [
{
"bearerAuth": []
}
],
"responses": {
"200": {
"description": "List immutable snapshot metadata; policies read permission"
},
"400": {
"description": "Invalid request"
},
"401": {
"description": "Authentication required"
},
"403": {
"description": "Insufficient permission"
},
"409": {
"description": "Stale revision, conflicting operation or resource still referenced"
}
},
"parameters": [
{
"name": "limit",
"in": "query",
"schema": {
"type": "integer",
"minimum": 1,
"maximum": 50,
"default": 20
}
},
{
"name": "offset",
"in": "query",
"schema": {
"type": "integer",
"minimum": 0,
"maximum": 10000,
"default": 0
}
}
]
},
"post": {
"summary": "Capture immutable effective policy for source agent; policies write permission",
"tags": [
"ops"
],
"security": [
{
"bearerAuth": []
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/CreatePolicySnapshot"
}
}
}
},
"responses": {
"201": {
"description": "Capture immutable effective policy for source agent; policies write permission"
},
"400": {
"description": "Invalid request"
},
"401": {
"description": "Authentication required"
},
"403": {
"description": "Insufficient permission"
},
"409": {
"description": "Stale revision, conflicting operation or resource still referenced"
}
}
}
},
"/api/v1/policies/snapshots/{id}": {
"parameters": [
{
"name": "id",
"in": "path",
"required": true,
"schema": {
"type": "string",
"minLength": 1,
"maxLength": 128
}
}
],
"get": {
"summary": "Get immutable snapshot and payload; policies read permission",
"tags": [
"ops"
],
"security": [
{
"bearerAuth": []
}
],
"responses": {
"200": {
"description": "Get immutable snapshot and payload; policies read permission"
},
"400": {
"description": "Invalid request"
},
"401": {
"description": "Authentication required"
},
"403": {
"description": "Insufficient permission"
},
"409": {
"description": "Stale revision, conflicting operation or resource still referenced"
}
}
},
"delete": {
"summary": "Delete unreferenced snapshot; policies write permission",
"tags": [
"ops"
],
"security": [
{
"bearerAuth": []
}
],
"responses": {
"200": {
"description": "Delete unreferenced snapshot; policies write permission"
},
"400": {
"description": "Invalid request"
},
"401": {
"description": "Authentication required"
},
"403": {
"description": "Insufficient permission"
},
"409": {
"description": "Stale revision, conflicting operation or resource still referenced"
}
}
}
},
"/api/v1/policies/snapshots/{id}/diff": {
"parameters": [
{
"name": "id",
"in": "path",
"required": true,
"schema": {
"type": "string",
"minLength": 1,
"maxLength": 128
}
}
],
"post": {
"summary": "Read-only bounded diff for up to 100 agents; policies write permission",
"tags": [
"ops"
],
"security": [
{
"bearerAuth": []
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/PolicySnapshotDiffRequest"
}
}
}
},
"responses": {
"200": {
"description": "Read-only bounded diff for up to 100 agents; policies write permission"
},
"400": {
"description": "Invalid request"
},
"401": {
"description": "Authentication required"
},
"403": {
"description": "Insufficient permission"
},
"409": {
"description": "Stale revision, conflicting operation or resource still referenced"
}
}
}
},
"/api/v1/policies/rollouts": {
"get": {
"summary": "List rollout metadata; policies read permission",
"tags": [
"ops"
],
"security": [
{
"bearerAuth": []
}
],
"responses": {
"200": {
"description": "List rollout metadata; policies read permission"
},
"400": {
"description": "Invalid request"
},
"401": {
"description": "Authentication required"
},
"403": {
"description": "Insufficient permission"
},
"409": {
"description": "Stale revision, conflicting operation or resource still referenced"
}
},
"parameters": [
{
"name": "limit",
"in": "query",
"schema": {
"type": "integer",
"minimum": 1,
"maximum": 50,
"default": 20
}
},
{
"name": "offset",
"in": "query",
"schema": {
"type": "integer",
"minimum": 0,
"maximum": 10000,
"default": 0
}
}
]
},
"post": {
"summary": "Start explicitly selected canary rollout with generation checks; policies write permission",
"tags": [
"ops"
],
"security": [
{
"bearerAuth": []
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/CreatePolicyRollout"
}
}
}
},
"responses": {
"201": {
"description": "Start explicitly selected canary rollout with generation checks; policies write permission"
},
"400": {
"description": "Invalid request"
},
"401": {
"description": "Authentication required"
},
"403": {
"description": "Insufficient permission"
},
"409": {
"description": "Stale revision, conflicting operation or resource still referenced"
}
}
}
},
"/api/v1/policies/rollouts/{id}": {
"parameters": [
{
"name": "id",
"in": "path",
"required": true,
"schema": {
"type": "string",
"minLength": 1,
"maxLength": 128
}
}
],
"get": {
"summary": "Get rollout and per-target acknowledgement; policies read permission",
"tags": [
"ops"
],
"security": [
{
"bearerAuth": []
}
],
"responses": {
"200": {
"description": "Get rollout and per-target acknowledgement; policies read permission"
},
"400": {
"description": "Invalid request"
},
"401": {
"description": "Authentication required"
},
"403": {
"description": "Insufficient permission"
},
"409": {
"description": "Stale revision, conflicting operation or resource still referenced"
}
}
},
"delete": {
"summary": "Delete finished rollout after all pins released; policies write permission",
"tags": [
"ops"
],
"security": [
{
"bearerAuth": []
}
],
"responses": {
"200": {
"description": "Delete finished rollout after all pins released; policies write permission"
},
"400": {
"description": "Invalid request"
},
"401": {
"description": "Authentication required"
},
"403": {
"description": "Insufficient permission"
},
"409": {
"description": "Stale revision, conflicting operation or resource still referenced"
}
}
}
},
"/api/v1/policies/rollouts/{id}/confirm": {
"parameters": [
{
"name": "id",
"in": "path",
"required": true,
"schema": {
"type": "string",
"minLength": 1,
"maxLength": 128
}
}
],
"post": {
"summary": "Confirm rollout at expected version after fresh exact canary acknowledgement; policies write permission",
"tags": [
"ops"
],
"security": [
{
"bearerAuth": []
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/PolicyRolloutTransition"
}
}
}
},
"responses": {
"200": {
"description": "Confirm rollout at expected version after fresh exact canary acknowledgement; policies write permission"
},
"400": {
"description": "Invalid request"
},
"401": {
"description": "Authentication required"
},
"403": {
"description": "Insufficient permission"
},
"409": {
"description": "Stale revision, conflicting operation or resource still referenced"
}
}
}
},
"/api/v1/policies/rollouts/{id}/rollback": {
"parameters": [
{
"name": "id",
"in": "path",
"required": true,
"schema": {
"type": "string",
"minLength": 1,
"maxLength": 128
}
}
],
"post": {
"summary": "Rollback to captured per-agent immutable policies; policies write permission",
"tags": [
"ops"
],
"security": [
{
"bearerAuth": []
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/PolicyRolloutTransition"
}
}
}
},
"responses": {
"200": {
"description": "Rollback to captured per-agent immutable policies; policies write permission"
},
"400": {
"description": "Invalid request"
},
"401": {
"description": "Authentication required"
},
"403": {
"description": "Insufficient permission"
},
"409": {
"description": "Stale revision, conflicting operation or resource still referenced"
}
}
}
},
"/api/v1/agents/{id}/policy-pin/release": {
"parameters": [
{
"name": "id",
"in": "path",
"required": true,
"schema": {
"type": "string",
"minLength": 1,
"maxLength": 128
}
}
],
"post": {
"summary": "Release selected rollout pin with expected generation; agents write permission",
"tags": [
"ops"
],
"security": [
{
"bearerAuth": []
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ReleasePolicyPin"
}
}
}
},
"responses": {
"200": {
"description": "Release selected rollout pin with expected generation; agents write permission"
},
"400": {
"description": "Invalid request"
},
"401": {
"description": "Authentication required"
},
"403": {
"description": "Insufficient permission"
},
"409": {
"description": "Stale revision, conflicting operation or resource still referenced"
}
}
}
},
"/api/v1/agent-labels": {
"get": {
"summary": "List labels; agents read permission",
"tags": [
"ops"
],
"security": [
{
"bearerAuth": []
}
],
"responses": {
"200": {
"description": "List labels; agents read permission"
},
"400": {
"description": "Invalid request"
},
"401": {
"description": "Authentication required"
},
"403": {
"description": "Insufficient permission"
},
"409": {
"description": "Stale revision, conflicting operation or resource still referenced"
}
},
"parameters": [
{
"name": "limit",
"in": "query",
"schema": {
"type": "integer",
"minimum": 1,
"maximum": 50,
"default": 20
}
},
{
"name": "offset",
"in": "query",
"schema": {
"type": "integer",
"minimum": 0,
"maximum": 10000,
"default": 0
}
}
]
},
"post": {
"summary": "Create unique agent label; agents write permission",
"tags": [
"ops"
],
"security": [
{
"bearerAuth": []
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/CreateAgentLabel"
}
}
}
},
"responses": {
"201": {
"description": "Create unique agent label; agents write permission"
},
"400": {
"description": "Invalid request"
},
"401": {
"description": "Authentication required"
},
"403": {
"description": "Insufficient permission"
},
"409": {
"description": "Stale revision, conflicting operation or resource still referenced"
}
}
}
},
"/api/v1/agent-labels/{id}": {
"parameters": [
{
"name": "id",
"in": "path",
"required": true,
"schema": {
"type": "string",
"minLength": 1,
"maxLength": 128
}
}
],
"patch": {
"summary": "Update label; agents write permission",
"tags": [
"ops"
],
"security": [
{
"bearerAuth": []
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/PatchAgentLabel"
}
}
}
},
"responses": {
"200": {
"description": "Update label; agents write permission"
},
"400": {
"description": "Invalid request"
},
"401": {
"description": "Authentication required"
},
"403": {
"description": "Insufficient permission"
},
"409": {
"description": "Stale revision, conflicting operation or resource still referenced"
}
}
},
"delete": {
"summary": "Delete label without deleting assigned agents; agents write permission",
"tags": [
"ops"
],
"security": [
{
"bearerAuth": []
}
],
"responses": {
"200": {
"description": "Delete label without deleting assigned agents; agents write permission"
},
"400": {
"description": "Invalid request"
},
"401": {
"description": "Authentication required"
},
"403": {
"description": "Insufficient permission"
},
"409": {
"description": "Stale revision, conflicting operation or resource still referenced"
}
}
}
},
"/api/v1/agents/{id}/labels": {
"parameters": [
{
"name": "id",
"in": "path",
"required": true,
"schema": {
"type": "string",
"minLength": 1,
"maxLength": 128
}
}
],
"get": {
"summary": "Read agent label IDs; agents read permission",
"tags": [
"ops"
],
"security": [
{
"bearerAuth": []
}
],
"responses": {
"200": {
"description": "Read agent label IDs; agents read permission"
},
"400": {
"description": "Invalid request"
},
"401": {
"description": "Authentication required"
},
"403": {
"description": "Insufficient permission"
},
"409": {
"description": "Stale revision, conflicting operation or resource still referenced"
}
}
},
"put": {
"summary": "Replace agent labels atomically; agents write permission",
"tags": [
"ops"
],
"security": [
{
"bearerAuth": []
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/PutAgentLabels"
}
}
}
},
"responses": {
"200": {
"description": "Replace agent labels atomically; agents write permission"
},
"400": {
"description": "Invalid request"
},
"401": {
"description": "Authentication required"
},
"403": {
"description": "Insufficient permission"
},
"409": {
"description": "Stale revision, conflicting operation or resource still referenced"
}
}
}
},
"/api/v1/agent-labels/preview-assignment": {
"post": {
"summary": "Preview add/replace policy-set assignment from explicit agent IDs or labels; policies read permission",
"tags": [
"ops"
],
"security": [
{
"bearerAuth": []
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/PreviewLabelAssignment"
}
}
}
},
"responses": {
"200": {
"description": "Preview add/replace policy-set assignment from explicit agent IDs or labels; policies read permission"
},
"400": {
"description": "Invalid request"
},
"401": {
"description": "Authentication required"
},
"403": {
"description": "Insufficient permission"
},
"409": {
"description": "Stale revision, conflicting operation or resource still referenced"
}
}
}
},
"/api/v1/agent-labels/assign-policy-sets": {
"post": {
"summary": "Apply previously reviewed assignment with exact per-agent generations; policies write permission",
"tags": [
"ops"
],
"security": [
{
"bearerAuth": []
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ApplyLabelAssignment"
}
}
}
},
"responses": {
"200": {
"description": "Apply previously reviewed assignment with exact per-agent generations; policies write permission"
},
"400": {
"description": "Invalid request"
},
"401": {
"description": "Authentication required"
},
"403": {
"description": "Insufficient permission"
},
"409": {
"description": "Stale revision, conflicting operation or resource still referenced"
}
}
}
}
}
}