Welcome to the Coperniq API release notes. This section highlights noteworthy changes across endpoints, schemas, and docs.

Recent highlights

  • New: AHJs — GET /ahjs (search, filter, and lat+lng geo lookup), GET /ahjs/{id}, and PATCH /ahjs/{id} to update custom property values. v2 mirrors these under /v2 with the standard success envelope.
  • Updated: GET /properties — now documents the ahj record type (custom AHJ properties only) and adds an isCustom boolean to every property to distinguish custom columns from built-in standard ones.
  • New: Sections — line items on projects, invoices, and bills can now be grouped into named sections (matching quotes and work orders); read responses expose sectionName per line item.
  • New: Vendors — full CRUD via GET/POST /vendors, GET/PATCH/DELETE /vendors/{vendorId}, GET /vendors/search, and many-to-many project linking via POST/DELETE /projects/{projectId}/vendors/{vendorId}. Vendor-specific fields: vendorType (enum), website, and projectIds.
  • New: Labels — GET /labels (filter by type), POST /labels, GET /labels/{labelId}. type is WORK (work orders) or ASSET. v2 mirrors these under /v2 with the standard success envelope.
  • New: Assets — GET /assets (filter by account_id), POST /assets, GET/PATCH /assets/{assetId} (set isArchived: true via PATCH to archive). v2 mirrors these under /v2 with the standard success envelope.

Looking for a specific date? See the entries below.

Form template update endpoint

Update a form template

A new endpoint lets you update an existing form template:

  • PATCH /form-templates/{formTemplateId} — Update a form template’s name, property layout, assignee, collaborators, labels, and due date configuration.

All fields are optional — only provided fields are updated. formLayouts is optional — when provided, it fully replaces all layout groups and their fields; omit it to leave the existing layout untouched. Include existing groups with their id to preserve them, or omit the id for new groups. Groups not included are removed. Array order determines position on the form.

Fields within each group are set via the properties array, where each item specifies a type (TEXT, NUMERIC, DROPDOWN, or FILE) or references an existing project property via projectPropertyKey.

Note: Layout id values (for groups and properties) are not stable — they change after every update. Always re-fetch the template via GET /form-templates/{formTemplateId} to get current IDs before referencing them in a subsequent update.

PATCH /form-templates/{formTemplateId}
1{
2 "name": "Site Inspection Checklist",
3 "formLayouts": [
4 {
5 "name": "Site Details",
6 "properties": [
7 { "projectPropertyKey": "site_address" },
8 { "type": "TEXT", "name": "Inspector Notes", "isRequired": false }
9 ]
10 }
11 ],
12 "assigneeProperty": "OWNER",
13 "dueDateXDaysAfter": 7
14}