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.
File uploads: streaming support, reliability fixes, and limits
What’s new?
- Streamed multipart uploads for files:
- POST
/projects/{projectId}/files/upload - POST
/requests/{requestId}/files/upload
- POST
- You can provide
phaseInstanceIdeither as a form field or as a?phaseInstanceId=query parameter; the API will include it once in the forwarded payload.
Fixes and improvements
- Robust parsing: files are fully consumed when building the outgoing
multipart/form-data. - Getting a project returns the project manager data.
- Allow files to be added in a certain project or request phase.
Usage notes
- Send
multipart/form-datawith afilepart; optional fields may includephaseInstanceId. - For non‑multipart uploads, send the raw bytes as the request body and pass filename/content type via:
- Headers
X-File-NameandX-File-Content-Type(case‑insensitive), or - Query params
nameandcontent_type.
- Headers
Platform limits
- The API enforces a 10 MB request limit. With base64 encoding and multipart overhead, practical max payload is ~6–7 MB.
- For larger uploads, use an out‑of‑band approach (e.g., presigned upload) and then create the file record by URL.
Compatibility
- No response shape changes. Successful uploads return:
id,name,downloadUrl,type,updatedAt,createdAt,companyId,metaData,source,createdByUser,isArchived.
