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.

Bills

New: Bills endpoints

You can now create, read, update, and delete bills on projects via the public API.

MethodPathDescription
GET/billsList all bills (paginated)
POST/billsCreate a bill
GET/bills/{billId}Get a bill by ID
PATCH/bills/{billId}Update a bill
DELETE/bills/{billId}Delete a bill
GET/projects/{projectId}/billsList bills for a project

Bills support two calculation methods:

  • LINE_ITEMS — itemised bill with one or more line items. Each line item requires catalogItemId, quantity, unitCost (must be > 0), and unitPrice (may be negative for discounts).
  • PERCENTAGE — percentage of the project’s base amount (0–100).

Create a LINE_ITEMS bill

POST /bills
1{
2 "recordId": 789225,
3 "calculationMethod": "LINE_ITEMS",
4 "lineItems": [
5 {
6 "catalogItemId": 5884,
7 "quantity": 2,
8 "unitCost": 100,
9 "unitPrice": 150
10 }
11 ],
12 "dueDate": "2026-05-01T00:00:00.000Z",
13 "description": "Materials and labor"
14}

Create a PERCENTAGE bill

POST /bills
1{
2 "recordId": 789225,
3 "calculationMethod": "PERCENTAGE",
4 "percentage": 25,
5 "dueDate": "2026-05-01T00:00:00.000Z"
6}

Business rules

  • calculationMethod cannot be changed after creation.
  • PERCENTAGE bills cannot have issueDate or status.
  • LINE_ITEMS bills: when issueDate is provided, status must also be provided and must not be DRAFT.
  • unitCost must be greater than 0 for all line items.
  • percentage must be between 0 and 100.

Nullable fields on project, account, and client updates

Improvement: Clear fields by passing null

You can now explicitly clear nullable fields on projects, accounts, and clients by passing null in a PATCH request. Previously, null values were ignored and the existing value was left unchanged.

This applies to the following endpoints:

  • PATCH /projects/{projectId}
  • PATCH /accounts/{accountId}
  • PATCH /clients/{clientId}

Clearable fields

ResourceFields
Projectdescription, primaryEmail, primaryPhone, value, size, ownerId, salesRepId, projectManagerId
Accountdescription, primaryEmail, primaryPhone, ownerId
Clientdescription, primaryEmail, primaryPhone, ownerId

Custom properties (via the custom object) can also be cleared by passing null for any key.

Example

PATCH /projects/{projectId}
1{
2 "description": null,
3 "ownerId": null,
4 "custom": {
5 "pud_incentive": null
6 }
7}

This will clear description, unassign the owner, and clear the pud_incentive custom property on the project.

Omitting a field entirely still leaves the existing value unchanged.