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.

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