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.

Projects search endpoint

What’s new?

  • Added GET /projects/search to query projects using up to two filters joined by logic (and/or).
  • Supports standard fields (e.g., status, title, city, type, numeric/datetime fields) and custom properties by key name.
  • Operators: eq, neq, gt, gte, lt, lte, contains, in, nin, between, exists.
  • Pagination and sorting supported via page_size, page, and order_by.

Parameters

  • prop1, op1, value1 (required)
  • prop2, op2, value2 (optional)
  • logic: and | or (default and)
  • page_size, page, order_by

Value formats

  • in/nin lists:
    • Plain CSV: value1=ACTIVE,ON_HOLD
    • Quoted CSV (values with commas): value1="Last, First",Other
    • JSON array: value1=["Last, First","Other"]
  • between ranges:
    • Dates: value1=2025-01-01,2025-12-31
    • Numbers: value1=10000,50000

Examples

  • Status equals ACTIVE:
    • GET /v1/projects/search?prop1=status&op1=eq&value1=ACTIVE
  • Title contains “Solar”:
    • GET /v1/projects/search?prop1=name&op1=contains&value1=Solar
  • Status IN (ACTIVE, ON_HOLD) AND city = Austin:
    • GET /v1/projects/search?prop1=status&op1=in&value1=ACTIVE,ON_HOLD&logic=and&prop2=city&op2=eq&value2=Austin
  • Custom multiselect includes any of [“1”, “Option, with a comma”]:
    • GET /v1/projects/search?prop1=custom_multiselect&op1=in&value1=["1","Option, with a comma"]
  • Updated within 2025:
    • GET /v1/projects/search?prop1=updatedAt&op1=between&value1=2025-01-01,2025-12-31