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

Recent highlights

  • 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.
  • New: Invoice payments — GET /invoices/{invoiceId}/payments, GET /invoices/{invoiceId}/payments/{paymentId}, and POST /invoices/{invoiceId}/payments (optional paymentReference on create).
  • New: Quotes — full CRUD via GET/POST /quotes, GET/PATCH/DELETE /quotes/{quoteId}, GET /quotes/{quoteId}/pdf, POST /quotes/{quoteId}/send, and GET /opportunities/{opportunityId}/quotes.
  • New: Work order line items — PUT /work-orders/{workOrderId}/line-items replaces line items on service work orders (account type). GET /work-orders/{workOrderId} now includes lineItems when present.
  • New: Taxes — GET /taxes lists company tax rates with pagination and archived filtering.
  • New: Bills — full CRUD for project bills via GET/POST /bills, GET/PATCH/DELETE /bills/{billId}, and GET /projects/{projectId}/bills. Supports LINE_ITEMS and PERCENTAGE calculation methods.
  • Improvement: Nullable fields on PATCH /projects/{projectId}, PATCH /accounts/{accountId}, and PATCH /clients/{clientId} — pass null to clear a field (e.g. description, ownerId, primaryEmail) or any custom property.

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.