Skip to main content
Base path: /custom-property (relative to your instance’s /api/v2). The standard endpoints provide reads and writes, subject to the constraints below. Search columns: name, key, identifier

Fields

Availability

Your organization must have customPropertiesEnabled enabled. Catalog requests return 403 when it is disabled. In the current API, order writes containing data.properties still succeed but silently discard those incoming values when the flag is off. Existing stored values are preserved. Confirm enablement and read back a test write before relying on property writes.
API-key permissions must also allow the catalog or deliverable operation you are performing. Enabling the feature does not grant permissions.

Create a definition

key, name, and dataType are required. A key starts with a letter, contains only letters and digits, and is at most 64 characters. Keys are immutable and unique case-insensitively across active and archived definitions. Use the exact stored key in order values. Display names can change and must be unique among active definitions. deliverableTypes defaults to ["order"]; this is the only supported scope. unitMeasureId is allowed only for number properties. Select definitions use options, an ordered array of nonempty strings unique case-insensitively. allowsAdHocOptions defaults to false and applies only to select types.

Write values on an order

Values belong in data.properties, keyed by the definition’s key, not its UUID or display name. Nonempty objects merge the supplied keys with existing values; omitted keys are preserved. Option matching is case-insensitive and preserves the catalog’s spelling. Unknown options fail unless allowsAdHocOptions is true, in which case they are appended to the catalog. Removing an option does not remove values already stored on orders; those values can still round-trip. Unknown property keys, invalid values, and nonempty values on unsupported deliverable types return 400.

Clear values

  • Omit data.properties to leave all property values untouched.
  • Send { "data": { "properties": { "squareFeet": null } } } to remove one value. An empty string or empty array also clears that key.
  • Send { "data": { "properties": {} } } or properties: null to clear all values. An empty object is not a no-op.

Filter, select, and count

The dotted select field is returned as the flattened key dataPropertiesSquareFeet, rather than as a nested data.properties object.
Range filters on custom-property paths are currently textual. For example, data.properties.squareFeet:gt=100 can treat 95 as greater than 100. Do not use :gt, :ge, :lt, or :le for numeric custom-property reporting. Fetch the values and compare them numerically in your integration.
Use POST /deliverable/group-and-count with groupByField: "data.properties.squareFeet" when you want counts by exact stored value. SUM and AVG across deliverables are not exposed by this API; POST /deliverable/query rejects grouped reads. See grouping and counting.

Archive and restore

DELETE /custom-property/{id} archives the definition and returns 204. It preserves order values and never frees the key. Restore with PATCH /custom-property/{id} and { "isArchived": false }. If another active definition has taken the display name, rename while restoring. Bulk DELETE is forbidden. Archived definitions keep validating existing order data, but are excluded from the active catalog and property import/export columns. List archived definitions with isArchived=true.