Download OpenAPI specification:Download
REST API for the qf host-based firewall control plane.
Authentication: Most endpoints require either a JWT cookie (qf_token, set by POST /auth/login)
or an Authorization: Bearer <token> header (JWT or opaque API token).
Tenant: Object endpoints use the tenant in the verified access token.
X-Tenant-ID cannot override it. Foreign object IDs return 404, including child routes.
Foreign rule and selector references return 400 on direct writes and version validation.
Optional X-Expected-Tenant-ID guards stale pages: a mismatch returns 409 with
code: tenant_changed before an object operation, refresh or tenant switch.
The header never selects a tenant. WebSocket accepts the same guard as
expected_tenant_id in its upgrade query.
RS256 public key set. Operator access tokens are RSA-signed by the CP; verifiers (the CP itself and the analytics service) check signatures with this key without holding the signing key. Served only when a signing key is configured.
{- "keys": [
- { }
]
}Selects an accessible tenant; optional tenant_id must be authorized. With no assignments, returns an identity-only session with empty tenant_id and no access to tenant data.
| username required | string |
| password required | string <password> |
| tenant_id | string Optional requested tenant UUID; absence selects an accessible tenant. |
{- "username": "string",
- "password": "pa$$word",
- "tenant_id": "string"
}{- "error": "string",
- "request_id": "string"
}Operator JWT only. Checks current role and assignments, then replaces access and refresh cookies. API tokens cannot switch tenant.
| tenant_id required | string <uuid> |
{- "tenant_id": "34f5c98e-f430-457b-a812-92637d0c6fd0"
}{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "username": "string",
- "email": "string",
- "role": "string",
- "tenant_id": "string",
- "access_ttl_seconds": 0
}JWT only. Checks current user, role, session versions, assignment and active tenant against primary state. Successful responses have no body and Cache-Control no-store. API tokens are not accepted.
{- "error": "string",
- "request_id": "string"
}JWT authentication only, including identity-only sessions; OIDC accounts cannot change a password here.
| current_password required | string <password> |
| new_password required | string <password> [ 8 .. 72 ] characters |
{- "current_password": "pa$$word",
- "new_password": "pa$$word"
}{- "error": "string",
- "request_id": "string"
}| X-Tenant-ID | string <uuid> Deprecated Ignored; tenant scope comes from the verified access token |
{- "version": "string",
- "git_sha": "string",
- "git_branch": "string",
- "build_time": "string",
- "go_version": "string",
- "hostname": "string",
- "started_at": "2019-08-24T14:15:22Z",
- "uptime_seconds": 0,
- "tenant_id": "34f5c98e-f430-457b-a812-92637d0c6fd0"
}| changed_since | string <date-time> Reconnect-backfill delta cursor (UI live-sync). When present, the endpoint returns ONLY rows changed at or after |
| limit | integer <= 10000 Default: 500 |
| before | string <date-time> Cursor — return hosts with created_at strictly before this RFC3339 timestamp (newest first). |
| cap | string Enum: "32" "2048" "other" VIZ-02 rule-cap drill-down filter — return only hosts whose resolved rule-cap tier equals this value. The resolved cap is metrics.rules_cap, falling back to capabilities.ruleCap; a host with no resolvable used+cap is excluded when this filter is set. |
| rules_min | integer VIZ-02 drill-down filter — only hosts whose metrics.rules_used is ≥ this value (inclusive). |
| rules_max | integer VIZ-02 drill-down filter — only hosts whose metrics.rules_used is ≤ this value (inclusive). |
| X-Tenant-ID | string <uuid> Deprecated Ignored; tenant scope comes from the verified access token |
[- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "tenant_id": "34f5c98e-f430-457b-a812-92637d0c6fd0",
- "hostname": "string",
- "labels": {
- "property1": "string",
- "property2": "string"
}, - "effective_labels": {
- "property1": "string",
- "property2": "string"
}, - "status": "enrolling",
- "current_generation": 0,
- "desired_generation": 0,
- "last_confirmed_generation": 0,
- "last_confirmed_at": "2019-08-24T14:15:22Z",
- "config_version": 0,
- "flow_events_enabled": true,
- "last_heartbeat_at": "2019-08-24T14:15:22Z",
- "agent_version": "string",
- "kernel_version": "string",
- "last_seen_ip": "string",
- "interfaces": [
- { }
], - "capabilities": { },
- "isolation": {
- "supported": true,
- "revision": 0,
- "desired": {
- "mode": "none",
- "exceptions": [
- {
- "direction": "ingress",
- "protocol": "tcp",
- "port_start": 1,
- "port_end": 1
}
]
}, - "applied": {
- "mode": "none",
- "exceptions": [
- {
- "direction": "ingress",
- "protocol": "tcp",
- "port_start": 1,
- "port_end": 1
}
], - "revision": 0,
- "generation": 0,
- "at": "2019-08-24T14:15:22Z"
}, - "status": "pending",
- "target_generation": 0,
- "error": "string",
- "requested_at": "2019-08-24T14:15:22Z"
}, - "metrics": { },
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z",
- "archived_at": "2019-08-24T14:15:22Z"
}
]| X-Tenant-ID | string <uuid> Deprecated Ignored; tenant scope comes from the verified access token |
| hostname required | string |
object | |
| status | string Default: "enrolling" |
{- "hostname": "string",
- "labels": {
- "property1": "string",
- "property2": "string"
}, - "status": "enrolling"
}{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "tenant_id": "34f5c98e-f430-457b-a812-92637d0c6fd0",
- "hostname": "string",
- "labels": {
- "property1": "string",
- "property2": "string"
}, - "effective_labels": {
- "property1": "string",
- "property2": "string"
}, - "status": "enrolling",
- "current_generation": 0,
- "desired_generation": 0,
- "last_confirmed_generation": 0,
- "last_confirmed_at": "2019-08-24T14:15:22Z",
- "config_version": 0,
- "flow_events_enabled": true,
- "last_heartbeat_at": "2019-08-24T14:15:22Z",
- "agent_version": "string",
- "kernel_version": "string",
- "last_seen_ip": "string",
- "interfaces": [
- { }
], - "capabilities": { },
- "isolation": {
- "supported": true,
- "revision": 0,
- "desired": {
- "mode": "none",
- "exceptions": [
- {
- "direction": "ingress",
- "protocol": "tcp",
- "port_start": 1,
- "port_end": 1
}
]
}, - "applied": {
- "mode": "none",
- "exceptions": [
- {
- "direction": "ingress",
- "protocol": "tcp",
- "port_start": 1,
- "port_end": 1
}
], - "revision": 0,
- "generation": 0,
- "at": "2019-08-24T14:15:22Z"
}, - "status": "pending",
- "target_generation": 0,
- "error": "string",
- "requested_at": "2019-08-24T14:15:22Z"
}, - "metrics": { },
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z",
- "archived_at": "2019-08-24T14:15:22Z"
}VIZ-02 fleet rule-cap pressure, aggregated server-side so the dashboard widget does not fetch the whole fleet. Hosts are grouped by resolved rule-cap tier (2048 bpf_loop / other), then bucketed into utilization cohorts (over/saturated/near/mid/low). Scoped to the caller's tenant.
| X-Tenant-ID | string <uuid> Deprecated Ignored; tenant scope comes from the verified access token |
{- "tiers": [
- {
- "key": "32",
- "cap": 0,
- "is_other": true,
- "total": 0,
- "cohorts": {
- "property1": 0,
- "property2": 0
}
}
], - "no_metrics": 0
}| keys required | Array of strings [ 1 .. 5 ] items unique |
| X-Tenant-ID | string <uuid> Deprecated Ignored; tenant scope comes from the verified access token |
[- {
- "key": "string",
- "value": "string",
- "count": 0,
- "children": [
- { }
]
}
]| keys required | Array of strings [ 1 .. 5 ] items unique |
| path | Array of strings <= 5 items |
| X-Tenant-ID | string <uuid> Deprecated Ignored; tenant scope comes from the verified access token |
[- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "tenant_id": "34f5c98e-f430-457b-a812-92637d0c6fd0",
- "hostname": "string",
- "labels": {
- "property1": "string",
- "property2": "string"
}, - "effective_labels": {
- "property1": "string",
- "property2": "string"
}, - "status": "enrolling",
- "current_generation": 0,
- "desired_generation": 0,
- "last_confirmed_generation": 0,
- "last_confirmed_at": "2019-08-24T14:15:22Z",
- "config_version": 0,
- "flow_events_enabled": true,
- "last_heartbeat_at": "2019-08-24T14:15:22Z",
- "agent_version": "string",
- "kernel_version": "string",
- "last_seen_ip": "string",
- "interfaces": [
- { }
], - "capabilities": { },
- "isolation": {
- "supported": true,
- "revision": 0,
- "desired": {
- "mode": "none",
- "exceptions": [
- {
- "direction": "ingress",
- "protocol": "tcp",
- "port_start": 1,
- "port_end": 1
}
]
}, - "applied": {
- "mode": "none",
- "exceptions": [
- {
- "direction": "ingress",
- "protocol": "tcp",
- "port_start": 1,
- "port_end": 1
}
], - "revision": 0,
- "generation": 0,
- "at": "2019-08-24T14:15:22Z"
}, - "status": "pending",
- "target_generation": 0,
- "error": "string",
- "requested_at": "2019-08-24T14:15:22Z"
}, - "metrics": { },
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z",
- "archived_at": "2019-08-24T14:15:22Z"
}
]| X-Tenant-ID | string <uuid> Deprecated Ignored; tenant scope comes from the verified access token |
[- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "tenant_id": "34f5c98e-f430-457b-a812-92637d0c6fd0",
- "hostname": "string",
- "labels": {
- "property1": "string",
- "property2": "string"
}, - "effective_labels": {
- "property1": "string",
- "property2": "string"
}, - "status": "enrolling",
- "current_generation": 0,
- "desired_generation": 0,
- "last_confirmed_generation": 0,
- "last_confirmed_at": "2019-08-24T14:15:22Z",
- "config_version": 0,
- "flow_events_enabled": true,
- "last_heartbeat_at": "2019-08-24T14:15:22Z",
- "agent_version": "string",
- "kernel_version": "string",
- "last_seen_ip": "string",
- "interfaces": [
- { }
], - "capabilities": { },
- "isolation": {
- "supported": true,
- "revision": 0,
- "desired": {
- "mode": "none",
- "exceptions": [
- {
- "direction": "ingress",
- "protocol": "tcp",
- "port_start": 1,
- "port_end": 1
}
]
}, - "applied": {
- "mode": "none",
- "exceptions": [
- {
- "direction": "ingress",
- "protocol": "tcp",
- "port_start": 1,
- "port_end": 1
}
], - "revision": 0,
- "generation": 0,
- "at": "2019-08-24T14:15:22Z"
}, - "status": "pending",
- "target_generation": 0,
- "error": "string",
- "requested_at": "2019-08-24T14:15:22Z"
}, - "metrics": { },
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z",
- "archived_at": "2019-08-24T14:15:22Z"
}
]| id required | string <uuid> |
| X-Tenant-ID | string <uuid> Deprecated Ignored; tenant scope comes from the verified access token |
{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "tenant_id": "34f5c98e-f430-457b-a812-92637d0c6fd0",
- "hostname": "string",
- "labels": {
- "property1": "string",
- "property2": "string"
}, - "effective_labels": {
- "property1": "string",
- "property2": "string"
}, - "status": "enrolling",
- "current_generation": 0,
- "desired_generation": 0,
- "last_confirmed_generation": 0,
- "last_confirmed_at": "2019-08-24T14:15:22Z",
- "config_version": 0,
- "flow_events_enabled": true,
- "last_heartbeat_at": "2019-08-24T14:15:22Z",
- "agent_version": "string",
- "kernel_version": "string",
- "last_seen_ip": "string",
- "interfaces": [
- { }
], - "capabilities": { },
- "isolation": {
- "supported": true,
- "revision": 0,
- "desired": {
- "mode": "none",
- "exceptions": [
- {
- "direction": "ingress",
- "protocol": "tcp",
- "port_start": 1,
- "port_end": 1
}
]
}, - "applied": {
- "mode": "none",
- "exceptions": [
- {
- "direction": "ingress",
- "protocol": "tcp",
- "port_start": 1,
- "port_end": 1
}
], - "revision": 0,
- "generation": 0,
- "at": "2019-08-24T14:15:22Z"
}, - "status": "pending",
- "target_generation": 0,
- "error": "string",
- "requested_at": "2019-08-24T14:15:22Z"
}, - "metrics": { },
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z",
- "archived_at": "2019-08-24T14:15:22Z"
}| id required | string <uuid> |
| X-Tenant-ID | string <uuid> Deprecated Ignored; tenant scope comes from the verified access token |
object | |
| status | string |
| flow_events_enabled | boolean |
{- "labels": {
- "property1": "string",
- "property2": "string"
}, - "status": "string",
- "flow_events_enabled": true
}{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "tenant_id": "34f5c98e-f430-457b-a812-92637d0c6fd0",
- "hostname": "string",
- "labels": {
- "property1": "string",
- "property2": "string"
}, - "effective_labels": {
- "property1": "string",
- "property2": "string"
}, - "status": "enrolling",
- "current_generation": 0,
- "desired_generation": 0,
- "last_confirmed_generation": 0,
- "last_confirmed_at": "2019-08-24T14:15:22Z",
- "config_version": 0,
- "flow_events_enabled": true,
- "last_heartbeat_at": "2019-08-24T14:15:22Z",
- "agent_version": "string",
- "kernel_version": "string",
- "last_seen_ip": "string",
- "interfaces": [
- { }
], - "capabilities": { },
- "isolation": {
- "supported": true,
- "revision": 0,
- "desired": {
- "mode": "none",
- "exceptions": [
- {
- "direction": "ingress",
- "protocol": "tcp",
- "port_start": 1,
- "port_end": 1
}
]
}, - "applied": {
- "mode": "none",
- "exceptions": [
- {
- "direction": "ingress",
- "protocol": "tcp",
- "port_start": 1,
- "port_end": 1
}
], - "revision": 0,
- "generation": 0,
- "at": "2019-08-24T14:15:22Z"
}, - "status": "pending",
- "target_generation": 0,
- "error": "string",
- "requested_at": "2019-08-24T14:15:22Z"
}, - "metrics": { },
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z",
- "archived_at": "2019-08-24T14:15:22Z"
}| id required | string <uuid> |
| X-Tenant-ID | string <uuid> Deprecated Ignored; tenant scope comes from the verified access token |
{- "error": "string",
- "request_id": "string"
}| id required | string <uuid> |
| X-Tenant-ID | string <uuid> Deprecated Ignored; tenant scope comes from the verified access token |
{- "supported": true,
- "revision": 7,
- "desired": {
- "mode": "partial",
- "exceptions": [
- {
- "direction": "egress",
- "protocol": "tcp",
- "port_start": 443,
- "port_end": 443
}
]
}, - "applied": {
- "revision": 7,
- "mode": "partial",
- "exceptions": [
- {
- "direction": "egress",
- "protocol": "tcp",
- "port_start": 443,
- "port_end": 443
}
], - "generation": 18,
- "at": "2026-08-30T16:00:00Z"
}, - "status": "applied",
- "target_generation": 18,
- "error": null,
- "requested_at": "2026-08-30T15:59:58Z"
}Idempotent by canonical desired representation. A new target or retry of a failed target returns 202. A request equal to an already pending/applied target returns 200 without a generation bump. Only admin and editor may call this operation.
| id required | string <uuid> |
| X-Tenant-ID | string <uuid> Deprecated Ignored; tenant scope comes from the verified access token |
| mode required | string Enum: "full" "partial" |
Array of objects (IsolationException) Must be absent or empty for full mode and contain at least one item for partial mode. Exact duplicates are normalized. Each item permits the initiated flow and only its conntrack-confirmed response. |
{- "mode": "full",
- "exceptions": [
- {
- "direction": "ingress",
- "protocol": "tcp",
- "port_start": 1,
- "port_end": 1
}
]
}{- "supported": true,
- "revision": 0,
- "desired": {
- "mode": "none",
- "exceptions": [
- {
- "direction": "ingress",
- "protocol": "tcp",
- "port_start": 1,
- "port_end": 1
}
]
}, - "applied": {
- "mode": "none",
- "exceptions": [
- {
- "direction": "ingress",
- "protocol": "tcp",
- "port_start": 1,
- "port_end": 1
}
], - "revision": 0,
- "generation": 0,
- "at": "2019-08-24T14:15:22Z"
}, - "status": "pending",
- "target_generation": 0,
- "error": "string",
- "requested_at": "2019-08-24T14:15:22Z"
}Idempotent. A new restore target or retry returns 202. If desired and applied state are already none, returns 200 without a generation bump. Only admin and editor may call this operation.
| id required | string <uuid> |
| X-Tenant-ID | string <uuid> Deprecated Ignored; tenant scope comes from the verified access token |
{- "supported": true,
- "revision": 0,
- "desired": {
- "mode": "none",
- "exceptions": [
- {
- "direction": "ingress",
- "protocol": "tcp",
- "port_start": 1,
- "port_end": 1
}
]
}, - "applied": {
- "mode": "none",
- "exceptions": [
- {
- "direction": "ingress",
- "protocol": "tcp",
- "port_start": 1,
- "port_end": 1
}
], - "revision": 0,
- "generation": 0,
- "at": "2019-08-24T14:15:22Z"
}, - "status": "pending",
- "target_generation": 0,
- "error": "string",
- "requested_at": "2019-08-24T14:15:22Z"
}| id required | string <uuid> |
| X-Tenant-ID | string <uuid> Deprecated Ignored; tenant scope comes from the verified access token |
[- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "tenant_id": "34f5c98e-f430-457b-a812-92637d0c6fd0",
- "name": "string",
- "labels": {
- "property1": "string",
- "property2": "string"
}, - "priority": 0,
- "member_count": 0,
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z",
- "archived_at": "2019-08-24T14:15:22Z"
}
]| id required | string <uuid> |
| X-Tenant-ID | string <uuid> Deprecated Ignored; tenant scope comes from the verified access token |
{- "host_id": "eb4e20fc-2b4a-4d0c-811f-48abcf12b89b",
- "default_ingress": "allow",
- "default_egress": "allow",
- "rules": [
- {
- "rule_id": "728c1541-d6d1-4290-9a53-cdf01dd32d60",
- "rule_name": "string",
- "policy_id": "ee9b03e0-6495-427a-85a5-34444d24ae04",
- "policy_name": "string",
- "priority": 0,
- "direction": "ingress",
- "action": "allow",
- "protocol": "string",
- "src_cidrs": [
- "string"
], - "dst_cidrs": [
- "string"
], - "src_ports": [
- "string"
], - "dst_ports": [
- "string"
], - "unresolved": [
- {
- "slot": "match",
- "error": "string"
}
]
}
]
}Bumps desired_generation and re-pushes the host's current bundle, overwriting any manual datapath drift. Requires admin or editor.
| id required | string <uuid> |
| X-Tenant-ID | string <uuid> Deprecated Ignored; tenant scope comes from the verified access token |
{- "error": "string",
- "request_id": "string"
}| id required | string <uuid> |
| X-Tenant-ID | string <uuid> Deprecated Ignored; tenant scope comes from the verified access token |
{- "error": "string",
- "request_id": "string"
}| id required | string <uuid> |
| X-Tenant-ID | string <uuid> Deprecated Ignored; tenant scope comes from the verified access token |
{- "error": "string",
- "request_id": "string"
}| id required | string <uuid> |
| X-Tenant-ID | string <uuid> Deprecated Ignored; tenant scope comes from the verified access token |
[- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "version": 0,
- "content": { },
- "status": "applied",
- "content_version": 0,
- "is_deletion": true,
- "created_by": "string",
- "created_at": "2019-08-24T14:15:22Z"
}
]| id required | string <uuid> |
| v required | integer >= 1 |
| X-Tenant-ID | string <uuid> Deprecated Ignored; tenant scope comes from the verified access token |
{- "error": "string",
- "request_id": "string"
}| id required | string <uuid> |
| X-Tenant-ID | string <uuid> Deprecated Ignored; tenant scope comes from the verified access token |
[- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "content": { },
- "content_version": 0,
- "is_deletion": true,
- "created_by": "string",
- "created_at": "2019-08-24T14:15:22Z"
}
]| id required | string <uuid> |
| X-Tenant-ID | string <uuid> Deprecated Ignored; tenant scope comes from the verified access token |
{ }{- "error": "string",
- "request_id": "string"
}| id required | string <uuid> |
| draftID required | string <uuid> |
| X-Tenant-ID | string <uuid> Deprecated Ignored; tenant scope comes from the verified access token |
{- "error": "string",
- "request_id": "string"
}| id required | string <uuid> |
| draftID required | string <uuid> |
| X-Tenant-ID | string <uuid> Deprecated Ignored; tenant scope comes from the verified access token |
{- "blast": {
- "affected_count": 0,
- "host_ids": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
], - "hosts": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "hostname": "string",
- "added": [
- "string"
], - "removed": [
- "string"
], - "changed": [
- "string"
], - "changed_detail": [
- {
- "rule_id": "728c1541-d6d1-4290-9a53-cdf01dd32d60",
- "name": "string",
- "fields": [
- {
- "field": "string",
- "before": "string",
- "after": "string"
}
]
}
], - "added_detail": [
- {
- "rule_id": "string",
- "name": "string",
- "fields": [
- {
- "field": "string",
- "value": "string"
}
]
}
], - "removed_detail": [
- {
- "rule_id": "string",
- "name": "string",
- "fields": [
- {
- "field": "string",
- "value": "string"
}
]
}
], - "removed_ids": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
]
}
]
}, - "traffic": [
- {
- "rule_id": "728c1541-d6d1-4290-9a53-cdf01dd32d60",
- "decisions": 0
}
], - "window": {
- "from": "2019-08-24T14:15:22Z",
- "to": "2019-08-24T14:15:22Z"
}
}| id required | string <uuid> |
| draftID required | string <uuid> |
| X-Tenant-ID | string <uuid> Deprecated Ignored; tenant scope comes from the verified access token |
{- "error": "string",
- "request_id": "string"
}| changed_since | string <date-time> Reconnect-backfill delta cursor (UI live-sync). When present, the endpoint returns ONLY rows changed at or after |
| X-Tenant-ID | string <uuid> Deprecated Ignored; tenant scope comes from the verified access token |
[- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "tenant_id": "34f5c98e-f430-457b-a812-92637d0c6fd0",
- "name": "string",
- "labels": {
- "property1": "string",
- "property2": "string"
}, - "priority": 0,
- "member_count": 0,
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z",
- "archived_at": "2019-08-24T14:15:22Z"
}
]| X-Tenant-ID | string <uuid> Deprecated Ignored; tenant scope comes from the verified access token |
| name required | string |
object | |
| priority | integer Default: 100 |
{- "name": "string",
- "labels": {
- "property1": "string",
- "property2": "string"
}, - "priority": 100
}{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "tenant_id": "34f5c98e-f430-457b-a812-92637d0c6fd0",
- "name": "string",
- "labels": {
- "property1": "string",
- "property2": "string"
}, - "priority": 0,
- "member_count": 0,
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z",
- "archived_at": "2019-08-24T14:15:22Z"
}| X-Tenant-ID | string <uuid> Deprecated Ignored; tenant scope comes from the verified access token |
[- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "tenant_id": "34f5c98e-f430-457b-a812-92637d0c6fd0",
- "name": "string",
- "labels": {
- "property1": "string",
- "property2": "string"
}, - "priority": 0,
- "member_count": 0,
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z",
- "archived_at": "2019-08-24T14:15:22Z"
}
]| id required | string <uuid> |
| X-Tenant-ID | string <uuid> Deprecated Ignored; tenant scope comes from the verified access token |
{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "tenant_id": "34f5c98e-f430-457b-a812-92637d0c6fd0",
- "name": "string",
- "labels": {
- "property1": "string",
- "property2": "string"
}, - "priority": 0,
- "member_count": 0,
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z",
- "archived_at": "2019-08-24T14:15:22Z"
}| id required | string <uuid> |
| X-Tenant-ID | string <uuid> Deprecated Ignored; tenant scope comes from the verified access token |
| name | string |
object | |
| priority | integer |
{- "name": "string",
- "labels": {
- "property1": "string",
- "property2": "string"
}, - "priority": 0
}{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "tenant_id": "34f5c98e-f430-457b-a812-92637d0c6fd0",
- "name": "string",
- "labels": {
- "property1": "string",
- "property2": "string"
}, - "priority": 0,
- "member_count": 0,
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z",
- "archived_at": "2019-08-24T14:15:22Z"
}| id required | string <uuid> |
| X-Tenant-ID | string <uuid> Deprecated Ignored; tenant scope comes from the verified access token |
{- "error": "string",
- "request_id": "string"
}| id required | string <uuid> |
| X-Tenant-ID | string <uuid> Deprecated Ignored; tenant scope comes from the verified access token |
[- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "tenant_id": "34f5c98e-f430-457b-a812-92637d0c6fd0",
- "hostname": "string",
- "labels": {
- "property1": "string",
- "property2": "string"
}, - "effective_labels": {
- "property1": "string",
- "property2": "string"
}, - "status": "enrolling",
- "current_generation": 0,
- "desired_generation": 0,
- "last_confirmed_generation": 0,
- "last_confirmed_at": "2019-08-24T14:15:22Z",
- "config_version": 0,
- "flow_events_enabled": true,
- "last_heartbeat_at": "2019-08-24T14:15:22Z",
- "agent_version": "string",
- "kernel_version": "string",
- "last_seen_ip": "string",
- "interfaces": [
- { }
], - "capabilities": { },
- "isolation": {
- "supported": true,
- "revision": 0,
- "desired": {
- "mode": "none",
- "exceptions": [
- {
- "direction": "ingress",
- "protocol": "tcp",
- "port_start": 1,
- "port_end": 1
}
]
}, - "applied": {
- "mode": "none",
- "exceptions": [
- {
- "direction": "ingress",
- "protocol": "tcp",
- "port_start": 1,
- "port_end": 1
}
], - "revision": 0,
- "generation": 0,
- "at": "2019-08-24T14:15:22Z"
}, - "status": "pending",
- "target_generation": 0,
- "error": "string",
- "requested_at": "2019-08-24T14:15:22Z"
}, - "metrics": { },
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z",
- "archived_at": "2019-08-24T14:15:22Z"
}
]| id required | string <uuid> |
| X-Tenant-ID | string <uuid> Deprecated Ignored; tenant scope comes from the verified access token |
| host_id required | string <uuid> |
{- "host_id": "eb4e20fc-2b4a-4d0c-811f-48abcf12b89b"
}{- "error": "string",
- "request_id": "string"
}| id required | string <uuid> |
| host_id required | string <uuid> |
| X-Tenant-ID | string <uuid> Deprecated Ignored; tenant scope comes from the verified access token |
{- "error": "string",
- "request_id": "string"
}| id required | string <uuid> |
| X-Tenant-ID | string <uuid> Deprecated Ignored; tenant scope comes from the verified access token |
{- "error": "string",
- "request_id": "string"
}| id required | string <uuid> |
| X-Tenant-ID | string <uuid> Deprecated Ignored; tenant scope comes from the verified access token |
{- "error": "string",
- "request_id": "string"
}| id required | string <uuid> |
| X-Tenant-ID | string <uuid> Deprecated Ignored; tenant scope comes from the verified access token |
[- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "version": 0,
- "content": { },
- "status": "applied",
- "content_version": 0,
- "is_deletion": true,
- "created_by": "string",
- "created_at": "2019-08-24T14:15:22Z"
}
]| id required | string <uuid> |
| v required | integer >= 1 |
| X-Tenant-ID | string <uuid> Deprecated Ignored; tenant scope comes from the verified access token |
{- "error": "string",
- "request_id": "string"
}| id required | string <uuid> |
| X-Tenant-ID | string <uuid> Deprecated Ignored; tenant scope comes from the verified access token |
[- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "content": { },
- "content_version": 0,
- "is_deletion": true,
- "created_by": "string",
- "created_at": "2019-08-24T14:15:22Z"
}
]| id required | string <uuid> |
| X-Tenant-ID | string <uuid> Deprecated Ignored; tenant scope comes from the verified access token |
{ }{- "error": "string",
- "request_id": "string"
}| id required | string <uuid> |
| draftID required | string <uuid> |
| X-Tenant-ID | string <uuid> Deprecated Ignored; tenant scope comes from the verified access token |
{- "error": "string",
- "request_id": "string"
}| id required | string <uuid> |
| draftID required | string <uuid> |
| X-Tenant-ID | string <uuid> Deprecated Ignored; tenant scope comes from the verified access token |
{- "blast": {
- "affected_count": 0,
- "host_ids": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
], - "hosts": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "hostname": "string",
- "added": [
- "string"
], - "removed": [
- "string"
], - "changed": [
- "string"
], - "changed_detail": [
- {
- "rule_id": "728c1541-d6d1-4290-9a53-cdf01dd32d60",
- "name": "string",
- "fields": [
- {
- "field": "string",
- "before": "string",
- "after": "string"
}
]
}
], - "added_detail": [
- {
- "rule_id": "string",
- "name": "string",
- "fields": [
- {
- "field": "string",
- "value": "string"
}
]
}
], - "removed_detail": [
- {
- "rule_id": "string",
- "name": "string",
- "fields": [
- {
- "field": "string",
- "value": "string"
}
]
}
], - "removed_ids": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
]
}
]
}, - "traffic": [
- {
- "rule_id": "728c1541-d6d1-4290-9a53-cdf01dd32d60",
- "decisions": 0
}
], - "window": {
- "from": "2019-08-24T14:15:22Z",
- "to": "2019-08-24T14:15:22Z"
}
}| id required | string <uuid> |
| draftID required | string <uuid> |
| X-Tenant-ID | string <uuid> Deprecated Ignored; tenant scope comes from the verified access token |
{- "error": "string",
- "request_id": "string"
}| id required | string <uuid> |
| limit | integer <= 10000 Default: 500 |
| X-Tenant-ID | string <uuid> Deprecated Ignored; tenant scope comes from the verified access token |
[- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "host_id": "eb4e20fc-2b4a-4d0c-811f-48abcf12b89b",
- "event_type": "datapath_drift",
- "severity": "info",
- "detail": "string",
- "ts": "2019-08-24T14:15:22Z"
}
]| id required | string <uuid> |
| start | string <date-time> |
| end | string <date-time> |
| limit | integer <= 10000 Default: 500 |
| rule_id | string <uuid> |
| action | string Enum: "allow" "deny" "log" |
| X-Tenant-ID | string <uuid> Deprecated Ignored; tenant scope comes from the verified access token |
[- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "host_id": "eb4e20fc-2b4a-4d0c-811f-48abcf12b89b",
- "rule_id": "728c1541-d6d1-4290-9a53-cdf01dd32d60",
- "policy_id": "ee9b03e0-6495-427a-85a5-34444d24ae04",
- "rule_name": "string",
- "policy_name": "string",
- "direction": "ingress",
- "action": "allow",
- "protocol": 0,
- "src_ip": "string",
- "src_port": 0,
- "dst_ip": "string",
- "dst_port": 0,
- "packet_size": 0,
- "tcp_flags": 0,
- "ct_state": "string",
- "interface": "string",
- "created_at": "2019-08-24T14:15:22Z"
}
]Checks host ownership before backfill or subscription; closes at credential expiry.
| id required | string <uuid> |
| X-Tenant-ID | string <uuid> Deprecated Ignored; tenant scope comes from the verified access token |
| Last-Event-ID | string Resume from this RFC3339Nano timestamp |
| id required | string <uuid> |
| start | string <date-time> |
| end | string <date-time> |
| limit | integer <= 10000 Default: 500 |
| X-Tenant-ID | string <uuid> Deprecated Ignored; tenant scope comes from the verified access token |
[- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "host_id": "eb4e20fc-2b4a-4d0c-811f-48abcf12b89b",
- "protocol": 0,
- "src_ip": "string",
- "src_port": 0,
- "dst_ip": "string",
- "dst_port": 0,
- "bytes_orig": 0,
- "bytes_reply": 0,
- "packets_orig": 0,
- "packets_reply": 0,
- "final_state": "string",
- "started_at": "2019-08-24T14:15:22Z",
- "ended_at": "2019-08-24T14:15:22Z",
- "interface": "string",
- "created_at": "2019-08-24T14:15:22Z"
}
]| id required | string <uuid> |
| group_by | string Default: "by-dst" Enum: "by-dst" "by-proto" "by-src-dst" |
| from | string <date-time> |
| to | string <date-time> |
| limit | integer <= 10000 Default: 500 |
| X-Tenant-ID | string <uuid> Deprecated Ignored; tenant scope comes from the verified access token |
{- "group_by": "by-dst",
- "window": {
- "from": "2019-08-24T14:15:22Z",
- "to": "2019-08-24T14:15:22Z"
}, - "rows": [
- {
- "protocol": 0,
- "src_ip": "string",
- "dst_ip": "string",
- "dst_port": 0,
- "total_bytes": 0,
- "total_packets": 0,
- "flow_count": 0
}
]
}| id required | string <uuid> |
| start | string <date-time> |
| end | string <date-time> |
| limit | integer <= 10000 Default: 500 |
| rule_id | string <uuid> |
| X-Tenant-ID | string <uuid> Deprecated Ignored; tenant scope comes from the verified access token |
[- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "host_id": "eb4e20fc-2b4a-4d0c-811f-48abcf12b89b",
- "rule_id": "728c1541-d6d1-4290-9a53-cdf01dd32d60",
- "policy_id": "ee9b03e0-6495-427a-85a5-34444d24ae04",
- "packets": 0,
- "bytes": 0,
- "interface": "string",
- "ts": "2019-08-24T14:15:22Z"
}
]| id required | string <uuid> |
| X-Tenant-ID | string <uuid> Deprecated Ignored; tenant scope comes from the verified access token |
[- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "host_id": "eb4e20fc-2b4a-4d0c-811f-48abcf12b89b",
- "rule_id": "728c1541-d6d1-4290-9a53-cdf01dd32d60",
- "policy_id": "ee9b03e0-6495-427a-85a5-34444d24ae04",
- "packets": 0,
- "bytes": 0,
- "interface": "string",
- "ts": "2019-08-24T14:15:22Z"
}
]Tenant-scoped rollup over the partitioned log_events table. group_by selects one closed preset (by-rule / by-host / timeline) — the string only SELECTS a static named query and is NEVER interpolated into SQL; an unknown non-empty value → 400. by-rule and timeline are host-scoped (host_id required); by-host aggregates top denying hosts across the whole tenant. The [from,to) window defaults to 24h and is capped 7d server-side so the scan stays partition-pruned. Read tier.
| group_by | string Enum: "by-rule" "by-host" "timeline" Aggregate preset; omitted = by-rule. Unknown value → 400. |
| host_id | string <uuid> Required for by-rule/timeline; ignored for by-host. |
| from | string <date-time> Inclusive lower bound on created_at (RFC3339); default now-24h. |
| to | string <date-time> Exclusive upper bound on created_at (RFC3339); default now. |
| limit | integer Max rows for by-rule/by-host (default 500, capped 10000). Ignored by timeline. |
| X-Tenant-ID | string <uuid> Deprecated Ignored; tenant scope comes from the verified access token |
{- "group_by": "string",
- "window": {
- "from": "2019-08-24T14:15:22Z",
- "to": "2019-08-24T14:15:22Z"
}, - "rows": [
- {
- "rule_id": "728c1541-d6d1-4290-9a53-cdf01dd32d60",
- "rule_name": "string",
- "host_id": "eb4e20fc-2b4a-4d0c-811f-48abcf12b89b",
- "hostname": "string",
- "bucket": "2019-08-24T14:15:22Z",
- "total": 0,
- "deny_count": 0
}
]
}| changed_since | string <date-time> Reconnect-backfill delta cursor (UI live-sync). When present, the endpoint returns ONLY rows changed at or after |
| X-Tenant-ID | string <uuid> Deprecated Ignored; tenant scope comes from the verified access token |
[- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "tenant_id": "34f5c98e-f430-457b-a812-92637d0c6fd0",
- "name": "string",
- "description": "string",
- "priority": 0,
- "selector": { },
- "interface_names": [
- "string"
], - "confirm_match_all": true,
- "current_version": 0,
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z",
- "archived_at": "2019-08-24T14:15:22Z"
}
]| X-Tenant-ID | string <uuid> Deprecated Ignored; tenant scope comes from the verified access token |
| name required | string |
| description | string |
| priority | integer Default: 0 |
| selector | object |
{- "name": "string",
- "description": "string",
- "priority": 0,
- "selector": { }
}{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "tenant_id": "34f5c98e-f430-457b-a812-92637d0c6fd0",
- "name": "string",
- "description": "string",
- "priority": 0,
- "selector": { },
- "interface_names": [
- "string"
], - "confirm_match_all": true,
- "current_version": 0,
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z",
- "archived_at": "2019-08-24T14:15:22Z"
}| X-Tenant-ID | string <uuid> Deprecated Ignored; tenant scope comes from the verified access token |
[- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "tenant_id": "34f5c98e-f430-457b-a812-92637d0c6fd0",
- "name": "string",
- "description": "string",
- "priority": 0,
- "selector": { },
- "interface_names": [
- "string"
], - "confirm_match_all": true,
- "current_version": 0,
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z",
- "archived_at": "2019-08-24T14:15:22Z"
}
]Returns a bucket-aggregated view of which hosts each policy currently reaches, so the node count is bounded by policy×bucket instead of policy×host. Every edge carries a matched_hosts coverage count and every bucket a total_hosts denominator, both computed over the same active-host set (revoked and enrolling hosts are excluded), so matched_hosts is always less than or equal to total_hosts. The group_by parameter selects the bucket dimension.
| group_by | string Default: "hostgroup" Example: group_by=label:env Bucket dimension. |
| X-Tenant-ID | string <uuid> Deprecated Ignored; tenant scope comes from the verified access token |
{- "policies": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string",
- "priority": 0
}
], - "buckets": [
- {
- "id": "string",
- "name": "string",
- "kind": "group",
- "total_hosts": 0
}
], - "edges": [
- {
- "policy_id": "ee9b03e0-6495-427a-85a5-34444d24ae04",
- "bucket_id": "string",
- "matched_hosts": 0
}
], - "meta": {
- "label_keys": [
- "string"
], - "group_by": "string",
- "node_count": 0
}
}Returns one row per policy with its active-host reach split by HOW a host is targeted, plus its rule count — the data behind the policies-list columns and the derived active/inert status. direct_hosts counts hosts matched by a direct block (a pinned host or a bare label/expression block); group_hosts counts hosts matched by a host-group block; total_hosts is the distinct hosts matched either way. A host can match both ways, so direct_hosts + group_hosts can exceed total_hosts — total_hosts is the true blast radius. Counts are over the active-host set (revoked and enrolling hosts excluded). rules_count is the policy's live rule count; a policy is considered inert when it reaches no host or carries no rule.
| X-Tenant-ID | string <uuid> Deprecated Ignored; tenant scope comes from the verified access token |
[- {
- "policy_id": "ee9b03e0-6495-427a-85a5-34444d24ae04",
- "direct_hosts": 0,
- "group_hosts": 0,
- "total_hosts": 0,
- "rules_count": 0
}
]| id required | string <uuid> |
| X-Tenant-ID | string <uuid> Deprecated Ignored; tenant scope comes from the verified access token |
{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "tenant_id": "34f5c98e-f430-457b-a812-92637d0c6fd0",
- "name": "string",
- "description": "string",
- "priority": 0,
- "selector": { },
- "interface_names": [
- "string"
], - "confirm_match_all": true,
- "current_version": 0,
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z",
- "archived_at": "2019-08-24T14:15:22Z"
}| id required | string <uuid> |
| X-Tenant-ID | string <uuid> Deprecated Ignored; tenant scope comes from the verified access token |
| name required | string |
| description | string |
| priority | integer |
| selector | object |
Array of objects | |
| confirm_match_all | boolean |
{- "name": "string",
- "description": "string",
- "priority": 0,
- "selector": { },
- "rules": [
- {
- "name": "string",
- "priority": 0,
- "direction": "ingress",
- "match": {
- "protocol": "tcp",
- "src_cidrs": [
- "string"
], - "dst_cidrs": [
- "string"
], - "src_ports": [
- "string"
], - "dst_ports": [
- "string"
], - "src_ip_set_ids": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
], - "dst_ip_set_ids": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
], - "src_port_set_ids": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
], - "dst_port_set_ids": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
], - "src_host_set_ids": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
], - "dst_host_set_ids": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
], - "src_ip_set_id": "2cec430c-4e57-445b-9ee4-4456027e9f74",
- "dst_ip_set_id": "b3baa8af-31da-491b-baf6-08f020b9f3d5",
- "src_port_set_id": "825f48db-cfc7-43ac-a854-f19de90e9851",
- "dst_port_set_id": "76c876f9-8a1a-423d-81bb-e91ddc4078f7",
- "src_host_set_id": "700402f6-9e4e-4340-a780-6ceaa5f67b4a",
- "dst_host_set_id": "46f5a812-c3b1-47fb-bece-e907b48f2096",
- "tcp_flags_mask": 0,
- "tcp_flags_match": 0
}, - "state": "string",
- "states": [
- "new"
], - "action": "allow",
- "log": false,
- "silent": true,
- "notrack": false,
- "log_rate_limit_per_sec": 0,
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08"
}
], - "confirm_match_all": true
}{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "tenant_id": "34f5c98e-f430-457b-a812-92637d0c6fd0",
- "name": "string",
- "description": "string",
- "priority": 0,
- "selector": { },
- "interface_names": [
- "string"
], - "confirm_match_all": true,
- "current_version": 0,
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z",
- "archived_at": "2019-08-24T14:15:22Z"
}| id required | string <uuid> |
| X-Tenant-ID | string <uuid> Deprecated Ignored; tenant scope comes from the verified access token |
{- "error": "string",
- "request_id": "string"
}| id required | string <uuid> |
| X-Tenant-ID | string <uuid> Deprecated Ignored; tenant scope comes from the verified access token |
{- "error": "string",
- "request_id": "string"
}| id required | string <uuid> |
| X-Tenant-ID | string <uuid> Deprecated Ignored; tenant scope comes from the verified access token |
{- "error": "string",
- "request_id": "string"
}| id required | string <uuid> |
| X-Tenant-ID | string <uuid> Deprecated Ignored; tenant scope comes from the verified access token |
[- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "policy_id": "ee9b03e0-6495-427a-85a5-34444d24ae04",
- "name": "string",
- "priority": 0,
- "direction": "ingress",
- "match": {
- "protocol": "tcp",
- "src_cidrs": [
- "string"
], - "dst_cidrs": [
- "string"
], - "src_ports": [
- "string"
], - "dst_ports": [
- "string"
], - "src_ip_set_ids": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
], - "dst_ip_set_ids": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
], - "src_port_set_ids": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
], - "dst_port_set_ids": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
], - "src_host_set_ids": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
], - "dst_host_set_ids": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
], - "src_ip_set_id": "2cec430c-4e57-445b-9ee4-4456027e9f74",
- "dst_ip_set_id": "b3baa8af-31da-491b-baf6-08f020b9f3d5",
- "src_port_set_id": "825f48db-cfc7-43ac-a854-f19de90e9851",
- "dst_port_set_id": "76c876f9-8a1a-423d-81bb-e91ddc4078f7",
- "src_host_set_id": "700402f6-9e4e-4340-a780-6ceaa5f67b4a",
- "dst_host_set_id": "46f5a812-c3b1-47fb-bece-e907b48f2096",
- "tcp_flags_mask": 0,
- "tcp_flags_match": 0
}, - "state": "string",
- "states": [
- "new"
], - "action": "allow",
- "log": true,
- "silent": true,
- "notrack": true,
- "log_rate_limit_per_sec": 0,
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
]| id required | string <uuid> |
| X-Tenant-ID | string <uuid> Deprecated Ignored; tenant scope comes from the verified access token |
| name required | string |
| priority | integer Default: 0 |
| direction | string Default: "ingress" Enum: "ingress" "egress" |
object (RuleMatch) BPF match criteria. Unknown keys and unsupported protocol values are
rejected with HTTP 400. Object-group references use arrays so every
reference is stored in policy versions and restored atomically. Legacy
singular | |
| state | string or null Deprecated |
| states | Array of strings Items Enum: "new" "established" "related" "invalid" Set of conntrack states this rule matches (any of). Empty = stateless. |
| action | string Default: "deny" Enum: "allow" "deny" "log" |
| log | boolean Default: false |
| silent | boolean |
| notrack | boolean Default: false Skip conntrack insert for flows this rule ALLOWs (saves LRU slots on high-volume stateless traffic). Does not change the verdict. |
| log_rate_limit_per_sec | integer <int32> Default: 0 Per-rule log token bucket, events/sec. 0 means "use the fleet default" (AgentConfig.default_log_rate_limit_per_sec, 100/s) — NOT "no logging". The datapath field is 16-bit, so values above 65535 truncate. |
{- "name": "string",
- "priority": 0,
- "direction": "ingress",
- "match": {
- "protocol": "tcp",
- "src_cidrs": [
- "string"
], - "dst_cidrs": [
- "string"
], - "src_ports": [
- "string"
], - "dst_ports": [
- "string"
], - "src_ip_set_ids": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
], - "dst_ip_set_ids": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
], - "src_port_set_ids": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
], - "dst_port_set_ids": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
], - "src_host_set_ids": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
], - "dst_host_set_ids": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
], - "src_ip_set_id": "2cec430c-4e57-445b-9ee4-4456027e9f74",
- "dst_ip_set_id": "b3baa8af-31da-491b-baf6-08f020b9f3d5",
- "src_port_set_id": "825f48db-cfc7-43ac-a854-f19de90e9851",
- "dst_port_set_id": "76c876f9-8a1a-423d-81bb-e91ddc4078f7",
- "src_host_set_id": "700402f6-9e4e-4340-a780-6ceaa5f67b4a",
- "dst_host_set_id": "46f5a812-c3b1-47fb-bece-e907b48f2096",
- "tcp_flags_mask": 0,
- "tcp_flags_match": 0
}, - "state": "string",
- "states": [
- "new"
], - "action": "allow",
- "log": false,
- "silent": true,
- "notrack": false,
- "log_rate_limit_per_sec": 0
}{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "policy_id": "ee9b03e0-6495-427a-85a5-34444d24ae04",
- "name": "string",
- "priority": 0,
- "direction": "ingress",
- "match": {
- "protocol": "tcp",
- "src_cidrs": [
- "string"
], - "dst_cidrs": [
- "string"
], - "src_ports": [
- "string"
], - "dst_ports": [
- "string"
], - "src_ip_set_ids": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
], - "dst_ip_set_ids": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
], - "src_port_set_ids": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
], - "dst_port_set_ids": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
], - "src_host_set_ids": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
], - "dst_host_set_ids": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
], - "src_ip_set_id": "2cec430c-4e57-445b-9ee4-4456027e9f74",
- "dst_ip_set_id": "b3baa8af-31da-491b-baf6-08f020b9f3d5",
- "src_port_set_id": "825f48db-cfc7-43ac-a854-f19de90e9851",
- "dst_port_set_id": "76c876f9-8a1a-423d-81bb-e91ddc4078f7",
- "src_host_set_id": "700402f6-9e4e-4340-a780-6ceaa5f67b4a",
- "dst_host_set_id": "46f5a812-c3b1-47fb-bece-e907b48f2096",
- "tcp_flags_mask": 0,
- "tcp_flags_match": 0
}, - "state": "string",
- "states": [
- "new"
], - "action": "allow",
- "log": true,
- "silent": true,
- "notrack": true,
- "log_rate_limit_per_sec": 0,
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}| id required | string <uuid> |
| ruleID required | string <uuid> |
| X-Tenant-ID | string <uuid> Deprecated Ignored; tenant scope comes from the verified access token |
{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "policy_id": "ee9b03e0-6495-427a-85a5-34444d24ae04",
- "name": "string",
- "priority": 0,
- "direction": "ingress",
- "match": {
- "protocol": "tcp",
- "src_cidrs": [
- "string"
], - "dst_cidrs": [
- "string"
], - "src_ports": [
- "string"
], - "dst_ports": [
- "string"
], - "src_ip_set_ids": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
], - "dst_ip_set_ids": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
], - "src_port_set_ids": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
], - "dst_port_set_ids": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
], - "src_host_set_ids": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
], - "dst_host_set_ids": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
], - "src_ip_set_id": "2cec430c-4e57-445b-9ee4-4456027e9f74",
- "dst_ip_set_id": "b3baa8af-31da-491b-baf6-08f020b9f3d5",
- "src_port_set_id": "825f48db-cfc7-43ac-a854-f19de90e9851",
- "dst_port_set_id": "76c876f9-8a1a-423d-81bb-e91ddc4078f7",
- "src_host_set_id": "700402f6-9e4e-4340-a780-6ceaa5f67b4a",
- "dst_host_set_id": "46f5a812-c3b1-47fb-bece-e907b48f2096",
- "tcp_flags_mask": 0,
- "tcp_flags_match": 0
}, - "state": "string",
- "states": [
- "new"
], - "action": "allow",
- "log": true,
- "silent": true,
- "notrack": true,
- "log_rate_limit_per_sec": 0,
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}| id required | string <uuid> |
| ruleID required | string <uuid> |
| X-Tenant-ID | string <uuid> Deprecated Ignored; tenant scope comes from the verified access token |
| name required | string |
| priority | integer Default: 0 |
| direction | string Default: "ingress" Enum: "ingress" "egress" |
object (RuleMatch) BPF match criteria. Unknown keys and unsupported protocol values are
rejected with HTTP 400. Object-group references use arrays so every
reference is stored in policy versions and restored atomically. Legacy
singular | |
| state | string or null Deprecated |
| states | Array of strings Items Enum: "new" "established" "related" "invalid" Set of conntrack states this rule matches (any of). Empty = stateless. |
| action | string Default: "deny" Enum: "allow" "deny" "log" |
| log | boolean Default: false |
| silent | boolean |
| notrack | boolean Default: false Skip conntrack insert for flows this rule ALLOWs (saves LRU slots on high-volume stateless traffic). Does not change the verdict. |
| log_rate_limit_per_sec | integer <int32> Default: 0 Per-rule log token bucket, events/sec. 0 means "use the fleet default" (AgentConfig.default_log_rate_limit_per_sec, 100/s) — NOT "no logging". The datapath field is 16-bit, so values above 65535 truncate. |
{- "name": "string",
- "priority": 0,
- "direction": "ingress",
- "match": {
- "protocol": "tcp",
- "src_cidrs": [
- "string"
], - "dst_cidrs": [
- "string"
], - "src_ports": [
- "string"
], - "dst_ports": [
- "string"
], - "src_ip_set_ids": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
], - "dst_ip_set_ids": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
], - "src_port_set_ids": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
], - "dst_port_set_ids": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
], - "src_host_set_ids": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
], - "dst_host_set_ids": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
], - "src_ip_set_id": "2cec430c-4e57-445b-9ee4-4456027e9f74",
- "dst_ip_set_id": "b3baa8af-31da-491b-baf6-08f020b9f3d5",
- "src_port_set_id": "825f48db-cfc7-43ac-a854-f19de90e9851",
- "dst_port_set_id": "76c876f9-8a1a-423d-81bb-e91ddc4078f7",
- "src_host_set_id": "700402f6-9e4e-4340-a780-6ceaa5f67b4a",
- "dst_host_set_id": "46f5a812-c3b1-47fb-bece-e907b48f2096",
- "tcp_flags_mask": 0,
- "tcp_flags_match": 0
}, - "state": "string",
- "states": [
- "new"
], - "action": "allow",
- "log": false,
- "silent": true,
- "notrack": false,
- "log_rate_limit_per_sec": 0
}{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "policy_id": "ee9b03e0-6495-427a-85a5-34444d24ae04",
- "name": "string",
- "priority": 0,
- "direction": "ingress",
- "match": {
- "protocol": "tcp",
- "src_cidrs": [
- "string"
], - "dst_cidrs": [
- "string"
], - "src_ports": [
- "string"
], - "dst_ports": [
- "string"
], - "src_ip_set_ids": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
], - "dst_ip_set_ids": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
], - "src_port_set_ids": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
], - "dst_port_set_ids": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
], - "src_host_set_ids": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
], - "dst_host_set_ids": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
], - "src_ip_set_id": "2cec430c-4e57-445b-9ee4-4456027e9f74",
- "dst_ip_set_id": "b3baa8af-31da-491b-baf6-08f020b9f3d5",
- "src_port_set_id": "825f48db-cfc7-43ac-a854-f19de90e9851",
- "dst_port_set_id": "76c876f9-8a1a-423d-81bb-e91ddc4078f7",
- "src_host_set_id": "700402f6-9e4e-4340-a780-6ceaa5f67b4a",
- "dst_host_set_id": "46f5a812-c3b1-47fb-bece-e907b48f2096",
- "tcp_flags_mask": 0,
- "tcp_flags_match": 0
}, - "state": "string",
- "states": [
- "new"
], - "action": "allow",
- "log": true,
- "silent": true,
- "notrack": true,
- "log_rate_limit_per_sec": 0,
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}| id required | string <uuid> |
| X-Tenant-ID | string <uuid> Deprecated Ignored; tenant scope comes from the verified access token |
required | Array of objects (DryRunRuleSpec) | ||||||||||||||||||||||||
Array
| |||||||||||||||||||||||||
{- "rules": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "name": "string",
- "priority": 0,
- "direction": "ingress",
- "match": {
- "protocol": "tcp",
- "src_cidrs": [
- "string"
], - "dst_cidrs": [
- "string"
], - "src_ports": [
- "string"
], - "dst_ports": [
- "string"
], - "src_ip_set_ids": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
], - "dst_ip_set_ids": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
], - "src_port_set_ids": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
], - "dst_port_set_ids": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
], - "src_host_set_ids": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
], - "dst_host_set_ids": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
], - "src_ip_set_id": "2cec430c-4e57-445b-9ee4-4456027e9f74",
- "dst_ip_set_id": "b3baa8af-31da-491b-baf6-08f020b9f3d5",
- "src_port_set_id": "825f48db-cfc7-43ac-a854-f19de90e9851",
- "dst_port_set_id": "76c876f9-8a1a-423d-81bb-e91ddc4078f7",
- "src_host_set_id": "700402f6-9e4e-4340-a780-6ceaa5f67b4a",
- "dst_host_set_id": "46f5a812-c3b1-47fb-bece-e907b48f2096",
- "tcp_flags_mask": 0,
- "tcp_flags_match": 0
}, - "state": "string",
- "states": [
- "new"
], - "action": "allow",
- "log": true,
- "silent": true,
- "notrack": true,
- "log_rate_limit_per_sec": 0
}
]
}{- "affected_count": 0,
- "hosts": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "hostname": "string",
- "added": [
- "string"
], - "removed": [
- "string"
], - "changed": [
- "string"
], - "changed_detail": [
- {
- "rule_id": "728c1541-d6d1-4290-9a53-cdf01dd32d60",
- "name": "string",
- "fields": [
- {
- "field": "string",
- "before": "string",
- "after": "string"
}
]
}
], - "added_detail": [
- {
- "rule_id": "string",
- "name": "string",
- "fields": [
- {
- "field": "string",
- "value": "string"
}
]
}
], - "removed_detail": [
- {
- "rule_id": "string",
- "name": "string",
- "fields": [
- {
- "field": "string",
- "value": "string"
}
]
}
], - "removed_ids": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
]
}
]
}| id required | string <uuid> |
| X-Tenant-ID | string <uuid> Deprecated Ignored; tenant scope comes from the verified access token |
[- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "version": 0,
- "content": { },
- "status": "applied",
- "content_version": 0,
- "is_deletion": true,
- "created_by": "string",
- "created_at": "2019-08-24T14:15:22Z"
}
]| id required | string <uuid> |
| X-Tenant-ID | string <uuid> Deprecated Ignored; tenant scope comes from the verified access token |
[- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "content": { },
- "content_version": 0,
- "is_deletion": true,
- "created_by": "string",
- "created_at": "2019-08-24T14:15:22Z"
}
]| id required | string <uuid> |
| X-Tenant-ID | string <uuid> Deprecated Ignored; tenant scope comes from the verified access token |
{ }{- "error": "string",
- "request_id": "string"
}| id required | string <uuid> |
| draftId required | string <uuid> |
| X-Tenant-ID | string <uuid> Deprecated Ignored; tenant scope comes from the verified access token |
{- "error": "string",
- "request_id": "string"
}Computes the affected-host impact of a staged draft WITHOUT writing, enriched with the observed traffic (decisions) for the affected before-side rules over a bounded window. Read tier (writes nothing) — POST because it echoes the projected draft content. The identical route is mounted on object_groups and host_groups (shared version registrar). Optional from/to bound the traffic window (default 24h, capped 7d server-side, partition-pruned).
| id required | string <uuid> |
| draftId required | string <uuid> |
| from | string <date-time> Traffic window start (RFC3339); defaulted/capped server-side. |
| to | string <date-time> Traffic window end (RFC3339); defaults to now. |
| X-Tenant-ID | string <uuid> Deprecated Ignored; tenant scope comes from the verified access token |
{- "blast": {
- "affected_count": 0,
- "host_ids": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
], - "hosts": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "hostname": "string",
- "added": [
- "string"
], - "removed": [
- "string"
], - "changed": [
- "string"
], - "changed_detail": [
- {
- "rule_id": "728c1541-d6d1-4290-9a53-cdf01dd32d60",
- "name": "string",
- "fields": [
- {
- "field": "string",
- "before": "string",
- "after": "string"
}
]
}
], - "added_detail": [
- {
- "rule_id": "string",
- "name": "string",
- "fields": [
- {
- "field": "string",
- "value": "string"
}
]
}
], - "removed_detail": [
- {
- "rule_id": "string",
- "name": "string",
- "fields": [
- {
- "field": "string",
- "value": "string"
}
]
}
], - "removed_ids": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
]
}
]
}, - "traffic": [
- {
- "rule_id": "728c1541-d6d1-4290-9a53-cdf01dd32d60",
- "decisions": 0
}
], - "window": {
- "from": "2019-08-24T14:15:22Z",
- "to": "2019-08-24T14:15:22Z"
}
}| id required | string <uuid> |
| draftId required | string <uuid> |
| confirm_match_all | boolean Default: false |
| X-Tenant-ID | string <uuid> Deprecated Ignored; tenant scope comes from the verified access token |
{- "error": "string",
- "request_id": "string"
}| id required | string <uuid> |
| v required | integer |
| confirm_match_all | boolean Default: false |
| X-Tenant-ID | string <uuid> Deprecated Ignored; tenant scope comes from the verified access token |
{- "status": "reverted",
- "version": 0
}Tenant-scoped cross-entity browse of applied config_versions (policy, objectgroup, host_group, host_labels). Filter by optional entity type + created_at range; newest-first, LIMIT-capped. The display name is resolved from the version's content snapshot as-of that version (no JOIN). Read tier.
| type | string Enum: "policy" "objectgroup" "host_group" "host_labels" Filter by entity type; omitted = all types. Unknown value → 400. |
| from | string <date-time> Inclusive lower bound on created_at (RFC3339). |
| to | string <date-time> Exclusive upper bound on created_at (RFC3339). |
| limit | integer Max rows (default 200, capped 1000). |
| X-Tenant-ID | string <uuid> Deprecated Ignored; tenant scope comes from the verified access token |
[- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "entity_type": "string",
- "entity_id": "8161163a-f227-466f-bc01-090a01e80165",
- "name": "string",
- "version": 0,
- "status": "string",
- "content_version": 0,
- "is_deletion": true,
- "content": { },
- "created_by": "string",
- "created_at": "2019-08-24T14:15:22Z"
}
]Read-only combined impact preview for a SET of selected applied versions, in a single round-trip. Runs the per-host match-aware blast once per version and returns ONE observed-traffic aggregate over the UNION of their before-side rule ids over a bounded window (default 24h, capped 7d server-side, partition-pruned) — so a rule observed by two selected versions over the shared window is counted exactly once (no cross-version double-count) and N HTTP round-trips collapse to one. Preview-only — stages/applies/signs nothing. Repeated ids param (NOT comma-joined). A cross-tenant/missing/malformed id is silently OMITTED from the batch (partial results are valid), never a 404. An absent ids param is a 400.
| ids required | Array of strings <uuid> [ items <uuid > ] Applied-version ids to combine — repeated once per version ( |
| from | string <date-time> Traffic window start (RFC3339); defaulted/capped server-side. |
| to | string <date-time> Traffic window end (RFC3339); defaults to now. |
| X-Tenant-ID | string <uuid> Deprecated Ignored; tenant scope comes from the verified access token |
{- "versions": [
- {
- "version_id": "9e94c502-ca41-4342-a7f7-af96b444512c",
- "entity_type": "string",
- "entity_id": "8161163a-f227-466f-bc01-090a01e80165",
- "version": 0,
- "blast": { }
}
], - "traffic": [
- {
- "rule_id": "728c1541-d6d1-4290-9a53-cdf01dd32d60",
- "decisions": 0
}
], - "window": {
- "from": "2019-08-24T14:15:22Z",
- "to": "2019-08-24T14:15:22Z"
}
}Read-only impact preview for a selected applied version. Computes the per-host match-aware before/after ruleset diff (before = current effective ruleset, after = the version's snapshot) and attaches observed log_events traffic (decisions) for the affected BEFORE-side rule ids over a bounded window (default 24h, capped 7d server-side, partition-pruned). Preview-only — it stages/applies/signs nothing. A cross-tenant/missing id returns 404.
| versionID required | string <uuid> |
| from | string <date-time> Traffic window start (RFC3339); defaulted/capped server-side. |
| to | string <date-time> Traffic window end (RFC3339); defaults to now. |
| breakdown_by | string Default: "port" Enum: "port" "peer" "port_peer" B-09 traffic breakdown preset. Whitelisted; default |
| X-Tenant-ID | string <uuid> Deprecated Ignored; tenant scope comes from the verified access token |
{- "version_id": "9e94c502-ca41-4342-a7f7-af96b444512c",
- "entity_type": "string",
- "entity_id": "8161163a-f227-466f-bc01-090a01e80165",
- "version": 0,
- "blast": { },
- "traffic": [
- {
- "rule_id": "728c1541-d6d1-4290-9a53-cdf01dd32d60",
- "decisions": 0
}
], - "breakdown": [
- {
- "rule_id": "728c1541-d6d1-4290-9a53-cdf01dd32d60",
- "protocol": 0,
- "dst_port": 0,
- "peer_ip": "string",
- "decisions": 0,
- "approx_bytes": 0,
- "packets": 0
}
], - "window": {
- "from": "2019-08-24T14:15:22Z",
- "to": "2019-08-24T14:15:22Z"
}
}Read-only TWO-POINT comparison of versions A (past) and B (future) of the SAME entity. Unlike /versions/{id}/impact (which always diffs against the current live ruleset), compare diffs two arbitrary snapshots directly. For a policy it returns the OG-AWARE spec-level field diff (added/removed/changed with per-field before→after on resolved src/dst CIDRs, ports, protocol, tcp_flags, state, action) — object-group references are expanded so a rule differing only in a referenced group's membership classifies changed, not "No changes". For object_group/host_group/host_labels it returns the member set-diff (members_added/members_removed) with an empty diff. Both snapshots are upgraded via ToCurrent before diffing so an older content_version on A is not mis-diffed against a newer B. Side semantics: added = present in B not A; removed = in A not B; compare(A,B) and compare(B,A) are mirror images. Traffic (decisions) is attached for the A-SIDE rule ids over a bounded window and is empty when snapshot A carries no stable rule ids. Preview-only — it stages/applies/signs nothing. A and B MUST belong to the same entity (else 400); a missing/cross-tenant version returns 404.
| a required | string <uuid> Version id of side A (the "past" snapshot). |
| b required | string <uuid> Version id of side B (the "future"/other snapshot). |
| from | string <date-time> Traffic window start (RFC3339); defaulted/capped server-side. |
| to | string <date-time> Traffic window end (RFC3339); defaults to now. |
| X-Tenant-ID | string <uuid> Deprecated Ignored; tenant scope comes from the verified access token |
{- "entity_type": "string",
- "entity_id": "8161163a-f227-466f-bc01-090a01e80165",
- "a": {
- "version_id": "9e94c502-ca41-4342-a7f7-af96b444512c",
- "version": 0,
- "created_at": "2019-08-24T14:15:22Z",
- "name": "string"
}, - "b": {
- "version_id": "9e94c502-ca41-4342-a7f7-af96b444512c",
- "version": 0,
- "created_at": "2019-08-24T14:15:22Z",
- "name": "string"
}, - "diff": { },
- "members_added": [
- "string"
], - "members_removed": [
- "string"
], - "traffic": [
- {
- "rule_id": "728c1541-d6d1-4290-9a53-cdf01dd32d60",
- "decisions": 0
}
], - "window": {
- "from": "2019-08-24T14:15:22Z",
- "to": "2019-08-24T14:15:22Z"
}
}| changed_since | string <date-time> Reconnect-backfill delta cursor (UI live-sync). When present, the endpoint returns ONLY rows changed at or after |
| type | string Enum: "ipset" "portset" "hostset" |
| X-Tenant-ID | string <uuid> Deprecated Ignored; tenant scope comes from the verified access token |
[- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "tenant_id": "34f5c98e-f430-457b-a812-92637d0c6fd0",
- "type": "ipset",
- "name": "string",
- "spec": { },
- "resolved_at": "2019-08-24T14:15:22Z",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z",
- "archived_at": "2019-08-24T14:15:22Z"
}
]| X-Tenant-ID | string <uuid> Deprecated Ignored; tenant scope comes from the verified access token |
| type required | string Enum: "ipset" "portset" "hostset" |
| name required | string |
| spec | object |
{- "type": "ipset",
- "name": "string",
- "spec": { }
}{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "tenant_id": "34f5c98e-f430-457b-a812-92637d0c6fd0",
- "type": "ipset",
- "name": "string",
- "spec": { },
- "resolved_at": "2019-08-24T14:15:22Z",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z",
- "archived_at": "2019-08-24T14:15:22Z"
}| id required | string <uuid> |
| X-Tenant-ID | string <uuid> Deprecated Ignored; tenant scope comes from the verified access token |
{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "tenant_id": "34f5c98e-f430-457b-a812-92637d0c6fd0",
- "type": "ipset",
- "name": "string",
- "spec": { },
- "resolved_at": "2019-08-24T14:15:22Z",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z",
- "archived_at": "2019-08-24T14:15:22Z"
}| id required | string <uuid> |
| X-Tenant-ID | string <uuid> Deprecated Ignored; tenant scope comes from the verified access token |
| spec required | object |
{- "spec": { }
}{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "tenant_id": "34f5c98e-f430-457b-a812-92637d0c6fd0",
- "type": "ipset",
- "name": "string",
- "spec": { },
- "resolved_at": "2019-08-24T14:15:22Z",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z",
- "archived_at": "2019-08-24T14:15:22Z"
}| X-Tenant-ID | string <uuid> Deprecated Ignored; tenant scope comes from the verified access token |
[- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "tenant_id": "34f5c98e-f430-457b-a812-92637d0c6fd0",
- "type": "ipset",
- "name": "string",
- "spec": { },
- "resolved_at": "2019-08-24T14:15:22Z",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z",
- "archived_at": "2019-08-24T14:15:22Z"
}
]| id required | string <uuid> |
| X-Tenant-ID | string <uuid> Deprecated Ignored; tenant scope comes from the verified access token |
{- "error": "string",
- "request_id": "string"
}| id required | string <uuid> |
| X-Tenant-ID | string <uuid> Deprecated Ignored; tenant scope comes from the verified access token |
{- "error": "string",
- "request_id": "string"
}| id required | string <uuid> |
| X-Tenant-ID | string <uuid> Deprecated Ignored; tenant scope comes from the verified access token |
[- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "version": 0,
- "content": { },
- "status": "applied",
- "content_version": 0,
- "is_deletion": true,
- "created_by": "string",
- "created_at": "2019-08-24T14:15:22Z"
}
]| id required | string <uuid> |
| v required | integer >= 1 |
| X-Tenant-ID | string <uuid> Deprecated Ignored; tenant scope comes from the verified access token |
{- "error": "string",
- "request_id": "string"
}| id required | string <uuid> |
| X-Tenant-ID | string <uuid> Deprecated Ignored; tenant scope comes from the verified access token |
[- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "content": { },
- "content_version": 0,
- "is_deletion": true,
- "created_by": "string",
- "created_at": "2019-08-24T14:15:22Z"
}
]| id required | string <uuid> |
| X-Tenant-ID | string <uuid> Deprecated Ignored; tenant scope comes from the verified access token |
{ }{- "error": "string",
- "request_id": "string"
}| id required | string <uuid> |
| draftID required | string <uuid> |
| X-Tenant-ID | string <uuid> Deprecated Ignored; tenant scope comes from the verified access token |
{- "error": "string",
- "request_id": "string"
}| id required | string <uuid> |
| draftID required | string <uuid> |
| X-Tenant-ID | string <uuid> Deprecated Ignored; tenant scope comes from the verified access token |
{- "blast": {
- "affected_count": 0,
- "host_ids": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
], - "hosts": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "hostname": "string",
- "added": [
- "string"
], - "removed": [
- "string"
], - "changed": [
- "string"
], - "changed_detail": [
- {
- "rule_id": "728c1541-d6d1-4290-9a53-cdf01dd32d60",
- "name": "string",
- "fields": [
- {
- "field": "string",
- "before": "string",
- "after": "string"
}
]
}
], - "added_detail": [
- {
- "rule_id": "string",
- "name": "string",
- "fields": [
- {
- "field": "string",
- "value": "string"
}
]
}
], - "removed_detail": [
- {
- "rule_id": "string",
- "name": "string",
- "fields": [
- {
- "field": "string",
- "value": "string"
}
]
}
], - "removed_ids": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
]
}
]
}, - "traffic": [
- {
- "rule_id": "728c1541-d6d1-4290-9a53-cdf01dd32d60",
- "decisions": 0
}
], - "window": {
- "from": "2019-08-24T14:15:22Z",
- "to": "2019-08-24T14:15:22Z"
}
}| id required | string <uuid> |
| draftID required | string <uuid> |
| X-Tenant-ID | string <uuid> Deprecated Ignored; tenant scope comes from the verified access token |
{- "error": "string",
- "request_id": "string"
}| changed_since | string <date-time> Reconnect-backfill delta cursor (UI live-sync). When present, the endpoint returns ONLY rows changed at or after |
| X-Tenant-ID | string <uuid> Deprecated Ignored; tenant scope comes from the verified access token |
[- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "tenant_id": "34f5c98e-f430-457b-a812-92637d0c6fd0",
- "type": "single_host",
- "target_host_id": "5fa08e70-cef9-414c-b387-7bde7b6f4011",
- "target_group_id": "efc47beb-e46d-465e-921d-3e02578ccf22",
- "label_template": {
- "property1": "string",
- "property2": "string"
}, - "max_uses": 0,
- "uses_count": 0,
- "expires_at": "2019-08-24T14:15:22Z",
- "token": "string"
}
]Target host and group must belong to the active tenant.
| X-Tenant-ID | string <uuid> Deprecated Ignored; tenant scope comes from the verified access token |
| type required | string Enum: "single_host" "bulk" |
| target_host_id | string <uuid> Required when type=single_host |
| target_group_id | string <uuid> bulk only — auto-add the enrolling host to this host-group (must be in tenant) |
object | |
| ttl_seconds | integer Default: 3600 |
| max_uses | integer Default: 1 |
{- "type": "single_host",
- "target_host_id": "5fa08e70-cef9-414c-b387-7bde7b6f4011",
- "target_group_id": "efc47beb-e46d-465e-921d-3e02578ccf22",
- "label_template": {
- "property1": "string",
- "property2": "string"
}, - "ttl_seconds": 3600,
- "max_uses": 1
}{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "tenant_id": "34f5c98e-f430-457b-a812-92637d0c6fd0",
- "type": "single_host",
- "target_host_id": "5fa08e70-cef9-414c-b387-7bde7b6f4011",
- "target_group_id": "efc47beb-e46d-465e-921d-3e02578ccf22",
- "label_template": {
- "property1": "string",
- "property2": "string"
}, - "max_uses": 0,
- "uses_count": 0,
- "expires_at": "2019-08-24T14:15:22Z",
- "token": "string"
}| start | string <date-time> |
| end | string <date-time> |
| limit | integer <= 10000 Default: 500 |
| actor_type | Array of strings Items Enum: "user" "api_token" "system" "agent" Actor kind(s) to include. Repeatable (?actor_type=user&actor_type=agent) — values are unioned server-side (OR). A single value stays valid. |
| actor_id | Array of strings <uuid> [ items <uuid > ] Actor UUID(s) to include. Repeatable (?actor_id=a&actor_id=b) — values are unioned server-side (OR). A single value stays valid (backward-compatible). |
| object_type | string |
| object_id | string <uuid> |
| q | string Free-text filter — case-insensitive substring match over the action string. |
| X-Tenant-ID | string <uuid> Deprecated Ignored; tenant scope comes from the verified access token |
[- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "tenant_id": "34f5c98e-f430-457b-a812-92637d0c6fd0",
- "actor_type": "string",
- "actor_id": "04f37679-bfbf-4906-b749-01756515cecf",
- "actor_username": "string",
- "action": "string",
- "object_type": "string",
- "object_id": "463a83d0-a816-4902-abba-2486e0c0a0bb",
- "before": { },
- "after": { },
- "created_at": "2019-08-24T14:15:22Z"
}
]| slug required | string^[a-z0-9][a-z0-9-]{0,62}$ |
| name required | string [ 1 .. 200 ] characters |
{- "slug": "string",
- "name": "string"
}{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "slug": "string",
- "name": "string",
- "status": "active",
- "status_changed_at": "2019-08-24T14:15:22Z"
}Requires a current active global admin. The selected tenant may be closed or empty. Slug and state are immutable through this operation. Changes are globally audited.
| id required | string <uuid> |
| name required | string [ 1 .. 200 ] characters Nonempty after trimming; at most 200 UTF-8 bytes |
{- "name": "string"
}{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "slug": "string",
- "name": "string",
- "status": "active",
- "status_changed_at": "2019-08-24T14:15:22Z"
}Active becomes suspended. Archived is rejected. Repeating the target state returns it without changing status_changed_at. Requires a current active global admin even if the selected tenant is closed or empty. Globally audited.
| id required | string <uuid> |
{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "slug": "string",
- "name": "string",
- "status": "active",
- "status_changed_at": "2019-08-24T14:15:22Z"
}Suspended becomes active. Archived must be restored first. Repeating the target state returns it without changing status_changed_at. Requires a current active global admin even if the selected tenant is closed or empty. Globally audited.
| id required | string <uuid> |
{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "slug": "string",
- "name": "string",
- "status": "active",
- "status_changed_at": "2019-08-24T14:15:22Z"
}Preserves configuration, hosts, telemetry, assignments and machine credentials. Repeating the target state returns it without changing status_changed_at. Requires a current active global admin even if the selected tenant is closed or empty. Globally audited.
| id required | string <uuid> |
{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "slug": "string",
- "name": "string",
- "status": "active",
- "status_changed_at": "2019-08-24T14:15:22Z"
}An explicit resume is required before work can continue. Active is rejected. Repeating the target state returns it without changing status_changed_at. Requires a current active global admin even if the selected tenant is closed or empty. Globally audited.
| id required | string <uuid> |
{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "slug": "string",
- "name": "string",
- "status": "active",
- "status_changed_at": "2019-08-24T14:15:22Z"
}Requires the exact current slug as explicit confirmation. Atomically removes all tenant-owned PostgreSQL data, including tenant audit/history and credentials, and records one global tenant.purged witness with actor and original UUID/slug/name. Preserves global users, PKI keys and other tenants. Repeating the same UUID and slug returns 204 even after that slug is reused by a new UUID. Unknown UUID returns 404. Runtime buffers are filtered before processing; name caches expire independently. Copies already delivered to an external SIEM are not deleted. All CP replicas must support the tenant write fence before this operation is used.
| id required | string <uuid> |
| confirm_slug required | string non-empty Exact slug of the tenant identified by the path UUID |
{- "confirm_slug": "string"
}{- "error": "string",
- "request_id": "string"
}A changed set revokes refresh; an identical set does not. Empty array removes all explicit assignments.
| id required | string <uuid> |
| tenant_ids required | Array of strings <uuid> [ items <uuid > ] |
{- "tenant_ids": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
]
}{- "tenant_ids": [
- "497f6eca-6276-4993-bfeb-53cbbbba6f08"
]
}Requires an operator admin JWT (cookie or Bearer); opaque API tokens are rejected. Manages global identities independently of the active tenant.
| changed_since | string <date-time> Reconnect-backfill delta cursor (UI live-sync). When present, the endpoint returns ONLY rows changed at or after |
[- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "username": "string",
- "email": "string",
- "status": "active",
- "role": "admin",
- "is_oidc": true,
- "last_login_at": "2019-08-24T14:15:22Z",
- "created_at": "2019-08-24T14:15:22Z",
- "archived_at": "2019-08-24T14:15:22Z"
}
]Requires an operator admin JWT (cookie or Bearer); opaque API tokens are rejected. Manages global identities independently of the active tenant.
| username required | string |
| email required | string <email> |
| password required | string <password> |
| role required | string Enum: "admin" "editor" "auditor" |
| tenant_ids | Array of strings <uuid> [ items <uuid > ] Default: [] |
{- "username": "string",
- "email": "user@example.com",
- "password": "pa$$word",
- "role": "admin",
- "tenant_ids": [ ]
}{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "username": "string",
- "email": "string",
- "status": "active",
- "role": "admin",
- "is_oidc": true,
- "last_login_at": "2019-08-24T14:15:22Z",
- "created_at": "2019-08-24T14:15:22Z",
- "archived_at": "2019-08-24T14:15:22Z"
}Requires an operator admin JWT (cookie or Bearer); opaque API tokens are rejected. Manages global identities independently of the active tenant.
[- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "username": "string",
- "email": "string",
- "status": "active",
- "role": "admin",
- "is_oidc": true,
- "last_login_at": "2019-08-24T14:15:22Z",
- "created_at": "2019-08-24T14:15:22Z",
- "archived_at": "2019-08-24T14:15:22Z"
}
]Requires an operator admin JWT (cookie or Bearer); opaque API tokens are rejected. Manages global identities independently of the active tenant.
| id required | string <uuid> |
{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "username": "string",
- "email": "string",
- "status": "active",
- "role": "admin",
- "is_oidc": true,
- "last_login_at": "2019-08-24T14:15:22Z",
- "created_at": "2019-08-24T14:15:22Z",
- "archived_at": "2019-08-24T14:15:22Z"
}Requires an operator admin JWT (cookie or Bearer); opaque API tokens are rejected. Manages global identities independently of the active tenant.
| id required | string <uuid> |
| status | string Enum: "active" "disabled" |
| password | string <password> |
{- "status": "active",
- "password": "pa$$word"
}{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "username": "string",
- "email": "string",
- "status": "active",
- "role": "admin",
- "is_oidc": true,
- "last_login_at": "2019-08-24T14:15:22Z",
- "created_at": "2019-08-24T14:15:22Z",
- "archived_at": "2019-08-24T14:15:22Z"
}Requires an operator admin JWT (cookie or Bearer); opaque API tokens are rejected. Manages global identities independently of the active tenant.
| id required | string <uuid> |
{- "error": "string",
- "request_id": "string"
}Requires an operator admin JWT (cookie or Bearer); opaque API tokens are rejected. Manages global identities independently of the active tenant.
| id required | string <uuid> |
{- "user_id": "a169451c-8525-4352-b8ca-070dd449a1a5",
- "role": "admin"
}Requires an operator admin JWT (cookie or Bearer); opaque API tokens are rejected. Manages global identities independently of the active tenant.
| id required | string <uuid> |
| role required | string Enum: "admin" "editor" "auditor" |
{- "role": "admin"
}{- "user_id": "a169451c-8525-4352-b8ca-070dd449a1a5",
- "role": "admin"
}Requires an operator admin JWT (cookie or Bearer); opaque API tokens are rejected. Manages global identities independently of the active tenant.
| id required | string <uuid> |
{- "error": "string",
- "request_id": "string"
}Requires an operator admin JWT (cookie or Bearer); opaque API tokens are rejected. Manages global identities independently of the active tenant.
| id required | string <uuid> |
{- "error": "string",
- "request_id": "string"
}| changed_since | string <date-time> Reconnect-backfill delta cursor (UI live-sync). When present, the endpoint returns ONLY rows changed at or after |
[- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "tenant_id": "34f5c98e-f430-457b-a812-92637d0c6fd0",
- "name": "string",
- "role": "admin",
- "created_by": "ee824cad-d7a6-4f48-87dc-e8461a9201c4",
- "expires_at": "2019-08-24T14:15:22Z",
- "last_used_at": "2019-08-24T14:15:22Z",
- "created_at": "2019-08-24T14:15:22Z",
- "archived_at": "2019-08-24T14:15:22Z",
- "token": "string"
}
]Admin creates a credential for the active tenant; global user and tenant management require a user JWT.
| name required | string |
| role required | string Enum: "admin" "editor" "auditor" |
| expires_at | string or null <date-time> |
{- "name": "string",
- "role": "admin",
- "expires_at": "2019-08-24T14:15:22Z"
}{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "tenant_id": "34f5c98e-f430-457b-a812-92637d0c6fd0",
- "name": "string",
- "role": "admin",
- "created_by": "ee824cad-d7a6-4f48-87dc-e8461a9201c4",
- "expires_at": "2019-08-24T14:15:22Z",
- "last_used_at": "2019-08-24T14:15:22Z",
- "created_at": "2019-08-24T14:15:22Z",
- "archived_at": "2019-08-24T14:15:22Z",
- "token": "string"
}[- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "tenant_id": "34f5c98e-f430-457b-a812-92637d0c6fd0",
- "name": "string",
- "role": "admin",
- "created_by": "ee824cad-d7a6-4f48-87dc-e8461a9201c4",
- "expires_at": "2019-08-24T14:15:22Z",
- "last_used_at": "2019-08-24T14:15:22Z",
- "created_at": "2019-08-24T14:15:22Z",
- "archived_at": "2019-08-24T14:15:22Z",
- "token": "string"
}
]| X-Tenant-ID | string <uuid> Deprecated Ignored; tenant scope comes from the verified access token |
[- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "tenant_id": "34f5c98e-f430-457b-a812-92637d0c6fd0",
- "user_id": "a169451c-8525-4352-b8ca-070dd449a1a5",
- "name": "string",
- "keys": [
- "string"
], - "is_system": true,
- "created_at": "2019-08-24T14:15:22Z"
}
]| X-Tenant-ID | string <uuid> Deprecated Ignored; tenant scope comes from the verified access token |
| name required | string |
| keys required | Array of strings [ 1 .. 5 ] items unique |
{- "name": "string",
- "keys": [
- "string"
]
}{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "tenant_id": "34f5c98e-f430-457b-a812-92637d0c6fd0",
- "user_id": "a169451c-8525-4352-b8ca-070dd449a1a5",
- "name": "string",
- "keys": [
- "string"
], - "is_system": true,
- "created_at": "2019-08-24T14:15:22Z"
}Same filters as /audit-log; returns only global events with empty tenant_id. Tenant audit never includes these events.
{- "error": "string",
- "request_id": "string"
}