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.

Assets — list, create, read, update

Manage physical assets tied to a site and account. Reads use project-service GraphQL; creates and updates call fleet-service.

Endpoints

MethodPathDescription
GET/assetsList assets (filters, pagination, optional account_id)
POST/assetsCreate an asset
GET/assets/{assetId}Get asset by id
PATCH/assets/{assetId}Update asset fields, including archiving

v2 exposes the same routes under the /v2 prefix with the standard { status, message, data } JSON envelope where applicable.

Query parameters (GET /assets)

ParameterDescription
page, page_sizePagination (page_size max 100)
order_byasc or desc by createdAt (default desc)
account_idFilter by account
site_idFilter by site
status, typeExact match
manufacturerCase-insensitive contains
is_archivedtrue / false (default false)
updated_after, updated_beforeISO date-time filters on updatedAt

Create body highlights

  • Required: accountId, siteId, type, manufacturer, model, serialNumber.
  • Optional: status, labelIds, dates, description, image file ids, size, expectedLifetime.

PATCH notes

  • siteId and accountId cannot be changed after creation; PATCH requests that include either field are rejected by request validation with 400 rather than being silently ignored.
  • Set isArchived: true to archive an asset, or isArchived: false to unarchive it.

Invoice payments

New: List, get, and create payments on an invoice

You can list payments for an invoice, fetch a single payment by id, and record manual payments. Paths are scoped under the invoice (there is no global /payments resource).

MethodPathDescription
GET/invoices/{invoiceId}/paymentsList all payment records for an invoice
GET/invoices/{invoiceId}/payments/{paymentId}Get one payment on an invoice
POST/invoices/{invoiceId}/paymentsCreate a manual payment on an invoice

v1 returns a JSON array for list, a single object for get-by-id, and the payment service payload for create (amounts in dollars on reads; create accepts dollars and converts to cents for core).

v2 (/v2/...) uses the same paths with the standard { status, message, data } envelope and dollar amounts on all responses.

Create a payment

POST /invoices/{invoiceId}/payments
1{
2 "amount": 125.5,
3 "paymentMethod": "CHECK",
4 "paymentDate": "2026-04-28T18:00:00.000Z",
5 "notes": "Deposit received",
6 "paymentReference": "CHK-1042"
7}

Notes

  • paymentReference and notes are optional.
  • paymentMethod must be one of: CASH, ACH, CREDIT_CARD, KLARNA, AFFIRM, CHECK.
  • Core does not expose GET /payment-records/:id; get-by-id resolves the payment from the invoice’s nested payment records.