Supported objects
Add and edit annotations
In the C1 UI
On any supported object’s detail page, an Annotations row appears in the header with a pencil icon. Click the pencil to open the Edit annotations drawer. In the drawer, each annotation is a key/value pair. Click + Add to add a new row, fill in a key and value, and click Save. To remove an annotation, click the delete icon next to the row and save.In the Terraform provider
Add anannotations block to any supported resource. The provider automatically sets the IaC well-known keys (managed_by, iac_workspace, iac_resource_address) — you only need to supply your own keys:
Through the API
Passannotations in the request body and include "annotations" in the update mask. The API uses merge semantics: keys you include are set or updated; keys you omit are left unchanged; set a key’s value to an empty string to delete it. You only need to send the keys you’re changing, not the full map.
myteam/cost-center is set and myteam/audit is deleted. Any other existing annotation keys are preserved.
Annotation key conventions
Keys can be anything that passes the shape rules, but prefixing with a short namespace avoids collisions with other tools’ keys. Use your team name, company domain, or a runtime identifier as the namespace. Within the namespace, lowercase with- or _ as separators is conventional. For example:
- Cost reporting — tag apps and access profiles with a cost center; annotations are returned on every API read, so you can query them or export to an ops dashboard
- Compliance scope — tag entitlements and access profiles with framework values like
soc2,hipaa, orpci - Ownership — record an owner for objects where no C1 user maps cleanly
- Audit cadence — tag access review templates with
quarterly,annual, orad-hoc
IaC management labels
A set of reserved keys mark an object as managed by an IaC tool. The C1 Terraform provider sets them automatically; you can also set them manually for other tools.
When these keys are present, the object’s detail page shows a Managed by [tool] chip.
iac_tool_version is intentionally not set automatically by the Terraform provider. Setting it automatically would produce a diff across every managed object after each provider upgrade, even when nothing in your configuration changed.Take ownership
When you edit any field on an IaC-managed object in the C1 UI — other than the annotations themselves — C1 clears the IaC keys in the same operation and shows a confirmation toast. This signals that C1, not your IaC tool, now manages the object. Editing annotations directly, or editing the object via the API orc1i, does not trigger this transfer — the IaC keys are left in place.
Use annotations in policy and automation logic
CEL expressions in policies, approver rules, and entitlement routing rules can read annotations on entitlements and app resources. This lets you fork logic based on metadata your team has already applied — without adding new fields or changing your object configuration.Read an annotation value
Use bracket notation to read a specific key. In policy conditions, policy approver expressions, and entitlement routing rules,entitlement.annotations is available:
role.annotations and scope.annotations are also available, corresponding to the resource and scope being evaluated:
Check whether a key exists
Use thein operator before reading a key to avoid a runtime error if the key isn’t present:
Example use cases
- Route approvals by team: In a policy approver expression, read
entitlement.annotations["team"]to send approval tasks to the right group without managing a separate mapping. - Fork logic for IaC-managed objects: Check
entitlement.annotations["managed_by"] == "terraform"in an entitlement routing rule to apply different settings to IaC-managed entitlements. - Scope routing by resource tier: In an entitlement routing rule, check
role.annotations["tier"] == "prod"to apply stricter access settings to production resources.
Limits
The 4 KB total budget is the binding constraint. Reduce key or value lengths if you hit it before reaching 16 keys.
Auditing
Every annotation change is recorded in the object’s history alongside other field changes. To view it, open the object’s detail page and click the Change history icon in the header. Changes to IaC management keys — setting or clearingmanaged_by — are called out with a distinct badge, so you can see at a glance when an object moved in or out of IaC management and who made the change.