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.

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
  • You can provide phaseInstanceId either 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-data with a file part; optional fields may include phaseInstanceId.
  • For non‑multipart uploads, send the raw bytes as the request body and pass filename/content type via:
    • Headers X-File-Name and X-File-Content-Type (case‑insensitive), or
    • Query params name and content_type.

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.