Apply a templating plan
Applies ontology fields and enum maps to the points of the devices you select. The call validates the plan and starts an operation that you poll until it finishes. Send validateOnly as true to check the plan without changing anything.
canonicalType, the deviceIds it covers (1 to 2,000), and up to 1,000 mappings. Each mapping has:
match: The points to change. Send exactly one ofgroupKey, a tuple (name,kind,unitSymbol,writable,pointEnum), orpointIds.field: The catalog field to apply, from List fields for a canonical type.overrides: Optional changes to the field’s defaults, such asdisplayName,unit,precision,covTolerance,defaultInGraph,prefix,suffix, anddataInterval.enumMapping: Optional enum maps forBoolandStrpoints.actionisSETto replace the maps,UNSETto remove them, orKEEPto leave them as they are.KEEPis the default.
pointIds) takes precedence over a group mapping that covers the same point. A plan can cover at most 5,000 distinct point ids.
Validate first
With validateOnly set to true, the response holds validationReport and nothing is written. Read:
valid:truewhen no issue hasERRORseverity.summary: How many points and devices the apply would reach, with counts of errors and warnings.mappings[]: The outcome of each mapping, in request order, with its ownissues.issues: Findings about the whole plan, such as devices that are already templated under another canonical type.unmappedGroups: Groups in your device selection that no mapping covers.etag: A fingerprint of the resolved plan.
code, a pointer to the part of your request it concerns, and a message. ERROR issues stop the apply. Warnings, such as NO_MATCH or ENUM_MAPPING_RECOMMENDED, do not.
Start the run
Send the same body with validateOnly removed (or false), a requestId of your choice, and the etag from the report. The response holds operation. Keep the last segment of operation.name as the operationId and poll Get a templating operation.
- Only
validateOnly: truemakes a dry run. If you leavevalidateOnlyout, the call starts a real run. - The
requestIdis unique per building. Sending the samerequestIdwith the same body again returns the operation it already started. Sending it with a different body returns400. - If the plan changed since you validated it, the
etagno longer matches and the call returns400. Validate again to get a newetag. Leaveetagout to skip the check. - The API does not stop two runs from touching the same points. The last write wins.
Authorizations
Paste an access token from Create an access token. Tokens expire, so request a new one if you receive 401.
Path Parameters
Building identifier from List buildings.
Body
Canonical type this plan is scoped to.
255(?s)(?=.*[^\p{C}\p{Z}])[\P{Cc}\n\r\t]*"AHU"
Explicit device ids to scope this plan to.
1 - 2000 elements255[^\p{C}\p{Z}]{1,128}Client-chosen idempotency key, unique per building. Repeating it with the same plan returns the existing operation; with a different plan it is rejected.
128[^\p{C}\p{Z}]{1,128}"ahu-1-apply-2026-09-30"
The plan's mappings. Empty or omitted on :clear clears the whole device selection for this canonical type.
1000Etag from a previous validation. If it no longer matches, the request fails with 400; validate again for a fresh etag. Omitted means no check.
128[^\p{C}\p{Z}]{1,128}"sha256:9f86d0818..."
Dry run: true returns the validation report and writes nothing.
false
Response
The started operation in operation, or the validation report in validationReport when validateOnly is true. Exactly one of the two is present.

