---
title: "Policy fields"
description: "All 61 fields a policy rule can test, with their types and operators."
label: "Policy fields"
generated: "the field descriptors in packages/policy/src/fields.ts"
---


A policy rule tests fields of the evaluation context. The list is closed: an unknown field is a validation error at authoring time, not a silent `undefined` at decision time. That is what makes evaluation total — every rule either matches or does not, and there is no third outcome.

:::note Amounts are inputs
`amount` is in minor currency units and exists purely as a policy input and as recorded decision context. Veefore evaluates it and records it. It does not hold, authorise, capture or move anything.
:::

The same list is served at `GET /v1/policies/builder-schema`, which is what the visual Policy Builder renders from.

## Agent

| Field | Type | Operators | Meaning |
| --- | --- | --- | --- |
| `agent.id` | `string` | `eq` `neq` `in` `not_in` `contains` `not_contains` `starts_with` `ends_with` `matches` `exists` `not_exists` | Immutable agent identifier. |
| `agent.name` | `string` | `eq` `neq` `in` `not_in` `contains` `not_contains` `starts_with` `ends_with` `matches` `exists` `not_exists` | Display name. Metadata only — never a security identity. |
| `agent.status` | `string` | `eq` `neq` `in` `not_in` `contains` `not_contains` `starts_with` `ends_with` `matches` `exists` `not_exists` | Lifecycle state. |
| `agent.risk_level` | `string` | `eq` `neq` `in` `not_in` `contains` `not_contains` `starts_with` `ends_with` `matches` `exists` `not_exists` | Standing risk rating of the agent. |
| `agent.verification_status` | `string` | `eq` `neq` `in` `not_in` `contains` `not_contains` `starts_with` `ends_with` `matches` `exists` `not_exists` | Identity verification state. |
| `agent.protocols` | `string[]` | `contains` `not_contains` `contains_any` `contains_all` `eq` `neq` `exists` `not_exists` | Protocols the agent is registered for. |
| `agent.capabilities` | `string[]` | `contains` `not_contains` `contains_any` `contains_all` `eq` `neq` `exists` `not_exists` | Capabilities currently granted to the agent. |
| `agent.tags` | `string[]` | `contains` `not_contains` `contains_any` `contains_all` `eq` `neq` `exists` `not_exists` | Operator-assigned labels. |

`agent.status` accepts: `PROVISIONING`, `ACTIVE`, `PAUSED`, `SUSPENDED`, `REVOKED`, `EXPIRED`, `DECOMMISSIONED`.

`agent.risk_level` accepts: `LOW`, `MEDIUM`, `HIGH`, `CRITICAL`.

`agent.verification_status` accepts: `UNVERIFIED`, `PENDING`, `VERIFIED`, `FAILED`.

`agent.protocols` accepts: `HTTP`, `MCP`, `A2A`.

## Tenancy

| Field | Type | Operators | Meaning |
| --- | --- | --- | --- |
| `organization.id` | `string` | `eq` `neq` `in` `not_in` `contains` `not_contains` `starts_with` `ends_with` `matches` `exists` `not_exists` | Organization identifier. |
| `workspace.id` | `string` | `eq` `neq` `in` `not_in` `contains` `not_contains` `starts_with` `ends_with` `matches` `exists` `not_exists` | Workspace identifier. |
| `environment.id` | `string` | `eq` `neq` `in` `not_in` `contains` `not_contains` `starts_with` `ends_with` `matches` `exists` `not_exists` | Environment identifier. |
| `environment.type` | `string` | `eq` `neq` `in` `not_in` `contains` `not_contains` `starts_with` `ends_with` `matches` `exists` `not_exists` | Deployment tier. |
| `environment.name` | `string` | `eq` `neq` `in` `not_in` `contains` `not_contains` `starts_with` `ends_with` `matches` `exists` `not_exists` | Environment display name. |

`environment.type` accepts: `DEVELOPMENT`, `STAGING`, `PRODUCTION`.

## Principal

| Field | Type | Operators | Meaning |
| --- | --- | --- | --- |
| `principal.type` | `string` | `eq` `neq` `in` `not_in` `contains` `not_contains` `starts_with` `ends_with` `matches` `exists` `not_exists` | Who initiated the request. |
| `principal.id` | `string` | `eq` `neq` `in` `not_in` `contains` `not_contains` `starts_with` `ends_with` `matches` `exists` `not_exists` | Identifier of the initiating principal. |

`principal.type` accepts: `USER`, `AGENT`, `SYSTEM`, `API_KEY`.

## Tool

| Field | Type | Operators | Meaning |
| --- | --- | --- | --- |
| `tool.id` | `string` | `eq` `neq` `in` `not_in` `contains` `not_contains` `starts_with` `ends_with` `matches` `exists` `not_exists` | Registered tool identifier. |
| `tool.key` | `string` | `eq` `neq` `in` `not_in` `contains` `not_contains` `starts_with` `ends_with` `matches` `exists` `not_exists` | Tool key, e.g. refund_customer. |
| `tool.kind` | `string` | `eq` `neq` `in` `not_in` `contains` `not_contains` `starts_with` `ends_with` `matches` `exists` `not_exists` | Execution kind. |
| `tool.protocol` | `string` | `eq` `neq` `in` `not_in` `contains` `not_contains` `starts_with` `ends_with` `matches` `exists` `not_exists` | Transport protocol. |
| `tool.risk_level` | `string` | `eq` `neq` `in` `not_in` `contains` `not_contains` `starts_with` `ends_with` `matches` `exists` `not_exists` | Risk rating assigned to the tool. |
| `tool.dangerous` | `boolean` | `is_true` `is_false` `eq` `neq` | Tool is flagged as destructive or high impact. |

`tool.kind` accepts: `HTTP`, `MCP`, `A2A`, `DATABASE`, `WEBHOOK`, `SIMULATED`, `CLIENT`.

`tool.protocol` accepts: `HTTP`, `MCP`, `A2A`.

`tool.risk_level` accepts: `LOW`, `MEDIUM`, `HIGH`, `CRITICAL`.

## Action

| Field | Type | Operators | Meaning |
| --- | --- | --- | --- |
| `capability` | `string` | `eq` `neq` `in` `not_in` `contains` `not_contains` `starts_with` `ends_with` `matches` `exists` `not_exists` | Capability required by the request, e.g. refund.create. |
| `action` | `string` | `eq` `neq` `in` `not_in` `contains` `not_contains` `starts_with` `ends_with` `matches` `exists` `not_exists` | Logical operation being performed. |

## Resource

| Field | Type | Operators | Meaning |
| --- | --- | --- | --- |
| `resource.key` | `string` | `eq` `neq` `in` `not_in` `contains` `not_contains` `starts_with` `ends_with` `matches` `exists` `not_exists` | Target resource identifier. |
| `resource.type` | `string` | `eq` `neq` `in` `not_in` `contains` `not_contains` `starts_with` `ends_with` `matches` `exists` `not_exists` | Resource category, e.g. database. |
| `resource.sensitivity` | `string` | `eq` `neq` `in` `not_in` `contains` `not_contains` `starts_with` `ends_with` `matches` `exists` `not_exists` | Data classification. |
| `resource.attributes.<path>` | `object` | `eq` `neq` `in` `not_in` `contains` `not_contains` `starts_with` `ends_with` `matches` `exists` `not_exists` `eq` `neq` `gt` `gte` `lt` `lte` `between` `in` `not_in` `exists` `not_exists` | Arbitrary resource attribute by path. |

`resource.sensitivity` accepts: `PUBLIC`, `INTERNAL`, `CONFIDENTIAL`, `RESTRICTED`.

## Request

| Field | Type | Operators | Meaning |
| --- | --- | --- | --- |
| `amount` | `amount` | `eq` `neq` `gt` `gte` `lt` `lte` `between` `in` `not_in` `exists` `not_exists` | Requested amount converted to the organization base currency, in minor units (e.g. 1000000 = ₹10,000.00 when the base is INR). Thresholds written here are in the base currency. A request whose currency cannot be converted is held for approval before policy amounts are relied on. Veefore never moves money. |
| `currency` | `string` | `eq` `neq` `in` `not_in` `contains` `not_contains` `starts_with` `ends_with` `matches` `exists` `not_exists` | Original ISO 4217 currency of the request, e.g. USD. Not the base currency. |
| `original_amount` | `amount` | `eq` `neq` `gt` `gte` `lt` `lte` `between` `in` `not_in` `exists` `not_exists` | Amount exactly as requested, in minor units of the original currency (no conversion). Combine with a currency condition when comparing it. |
| `original_currency` | `string` | `eq` `neq` `in` `not_in` `contains` `not_contains` `starts_with` `ends_with` `matches` `exists` `not_exists` | ISO 4217 currency the request was made in (same as "Currency"). |
| `destination.host` | `string` | `eq` `neq` `in` `not_in` `contains` `not_contains` `starts_with` `ends_with` `matches` `exists` `not_exists` | Outbound hostname the tool will contact. |
| `destination.risk_level` | `string` | `eq` `neq` `in` `not_in` `contains` `not_contains` `starts_with` `ends_with` `matches` `exists` `not_exists` | Risk rating of the destination. |
| `parameters.<path>` | `object` | `eq` `neq` `in` `not_in` `contains` `not_contains` `starts_with` `ends_with` `matches` `exists` `not_exists` `eq` `neq` `gt` `gte` `lt` `lte` `between` `in` `not_in` `exists` `not_exists` `is_true` `is_false` `eq` `neq` | Request parameter by dotted path. |

`destination.risk_level` accepts: `LOW`, `MEDIUM`, `HIGH`, `CRITICAL`.

## Risk

| Field | Type | Operators | Meaning |
| --- | --- | --- | --- |
| `risk.level` | `string` | `eq` `neq` `in` `not_in` `contains` `not_contains` `starts_with` `ends_with` `matches` `exists` `not_exists` | Computed risk level for this request. |
| `risk.score` | `number` | `eq` `neq` `gt` `gte` `lt` `lte` `between` `in` `not_in` `exists` `not_exists` | Weighted risk score, 0-100. |
| `risk.signals` | `string[]` | `contains` `not_contains` `contains_any` `contains_all` `eq` `neq` `exists` `not_exists` | Signal types that fired for this request. |

`risk.level` accepts: `LOW`, `MEDIUM`, `HIGH`, `CRITICAL`.

## Trust

| Field | Type | Operators | Meaning |
| --- | --- | --- | --- |
| `trust.identity_verified` | `boolean` | `is_true` `is_false` `eq` `neq` | Valid identity verification evidence exists. |
| `trust.organization_verified` | `boolean` | `is_true` `is_false` `eq` `neq` | Valid organization verification evidence exists. |
| `trust.security_attestation_valid` | `boolean` | `is_true` `is_false` `eq` `neq` | Unexpired security attestation evidence exists. |
| `trust.protocol_compliance_valid` | `boolean` | `is_true` `is_false` `eq` `neq` | Unexpired protocol compliance evidence exists. |
| `trust.active_incidents` | `number` | `eq` `neq` `gt` `gte` `lt` `lte` `between` `in` `not_in` `exists` `not_exists` | Open incidents involving this agent. |
| `trust.expired_evidence_count` | `number` | `eq` `neq` `gt` `gte` `lt` `lte` `between` `in` `not_in` `exists` `not_exists` | Trust evidence records that have expired. |

## Authority

| Field | Type | Operators | Meaning |
| --- | --- | --- | --- |
| `authority.max_amount` | `amount` | `eq` `neq` `gt` `gte` `lt` `lte` `between` `in` `not_in` `exists` `not_exists` | Maximum amount permitted by delegated authority, converted to the organization base currency (minor units). |
| `authority.capabilities` | `string[]` | `contains` `not_contains` `contains_any` `contains_all` `eq` `neq` `exists` `not_exists` | Capabilities permitted by delegated authority. |
| `authority.depth` | `number` | `eq` `neq` `gt` `gte` `lt` `lte` `between` `in` `not_in` `exists` `not_exists` | Delegation depth backing the authority. |
| `delegation.depth` | `number` | `eq` `neq` `gt` `gte` `lt` `lte` `between` `in` `not_in` `exists` `not_exists` | Depth of the delegation used. |
| `delegation.chain_length` | `number` | `eq` `neq` `gt` `gte` `lt` `lte` `between` `in` `not_in` `exists` `not_exists` | Number of delegations in the chain. |
| `delegation.valid` | `boolean` | `is_true` `is_false` `eq` `neq` | Delegation chain resolved successfully. |

## Context

| Field | Type | Operators | Meaning |
| --- | --- | --- | --- |
| `time.hour_utc` | `number` | `eq` `neq` `gt` `gte` `lt` `lte` `between` `in` `not_in` `exists` `not_exists` | Hour of day, 0-23, in UTC. |
| `time.day_of_week` | `number` | `eq` `neq` `gt` `gte` `lt` `lte` `between` `in` `not_in` `exists` `not_exists` | 0 = Sunday through 6 = Saturday, UTC. |
| `time.iso` | `string` | `eq` `neq` `in` `not_in` `contains` `not_contains` `starts_with` `ends_with` `matches` `exists` `not_exists` | Request timestamp, ISO-8601 UTC. |
| `velocity.actions_last_minute` | `number` | `eq` `neq` `gt` `gte` `lt` `lte` `between` `in` `not_in` `exists` `not_exists` | Agent action count in the trailing 60 seconds. |
| `velocity.actions_last_hour` | `number` | `eq` `neq` `gt` `gte` `lt` `lte` `between` `in` `not_in` `exists` `not_exists` | Agent action count in the trailing hour. |
| `velocity.actions_last_day` | `number` | `eq` `neq` `gt` `gte` `lt` `lte` `between` `in` `not_in` `exists` `not_exists` | Agent action count in the trailing 24 hours. |
| `velocity.amount_last_day` | `amount` | `eq` `neq` `gt` `gte` `lt` `lte` `between` `in` `not_in` `exists` `not_exists` | Sum of amounts in the trailing 24 hours, in the organization base currency. |
| `history.tool_used_before` | `boolean` | `is_true` `is_false` `eq` `neq` | Agent has previously used this tool. |
| `history.destination_used_before` | `boolean` | `is_true` `is_false` `eq` `neq` | Agent has previously contacted this destination. |
| `history.resource_used_before` | `boolean` | `is_true` `is_false` `eq` `neq` | Agent has previously touched this resource. |

## Approval

| Field | Type | Operators | Meaning |
| --- | --- | --- | --- |
| `approval.present` | `boolean` | `is_true` `is_false` `eq` `neq` | Request carries an approval reference. |
| `approval.valid` | `boolean` | `is_true` `is_false` `eq` `neq` | Presented approval is granted and bound to this request. |
