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, andlat+lnggeo lookup),GET /ahjs/{id}, andPATCH /ahjs/{id}to update custom property values. v2 mirrors these under/v2with the standard success envelope. - Updated:
GET /properties— now documents theahjrecord type (custom AHJ properties only) and adds anisCustomboolean 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 exposesectionNameper line item. - New: Vendors — full CRUD via
GET/POST /vendors,GET/PATCH/DELETE /vendors/{vendorId},GET /vendors/search, and many-to-many project linking viaPOST/DELETE /projects/{projectId}/vendors/{vendorId}. Vendor-specific fields:vendorType(enum),website, andprojectIds. - New: Labels —
GET /labels(filter bytype),POST /labels,GET /labels/{labelId}.typeisWORK(work orders) orASSET. v2 mirrors these under/v2with the standard success envelope. - New: Assets —
GET /assets(filter byaccount_id),POST /assets,GET/PATCH /assets/{assetId}(setisArchived: truevia PATCH to archive). v2 mirrors these under/v2with the standard success envelope.
Looking for a specific date? See the entries below.
Projects search endpoint
What’s new?
- Added GET
/projects/searchto query projects using up to two filters joined bylogic(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, andorder_by.
Parameters
prop1,op1,value1(required)prop2,op2,value2(optional)logic:and|or(defaultand)page_size,page,order_by
Value formats
in/ninlists:- Plain CSV:
value1=ACTIVE,ON_HOLD - Quoted CSV (values with commas):
value1="Last, First",Other - JSON array:
value1=["Last, First","Other"]
- Plain CSV:
betweenranges:- Dates:
value1=2025-01-01,2025-12-31 - Numbers:
value1=10000,50000
- Dates:
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
