projects

Search Projects

Search projects using up to two filters (prop1/op1/value1 and optionally prop2/op2/value2), combined with logic (AND/OR).

Properties:

  • propX can be a standard field (e.g., status, title, city, type, accountId, etc.) or a custom property key name.
  • Use the property key from your company settings.
  • Filter by parent account with accountId. clientId is accepted as a deprecated alias for backwards compatibility.

Operators (opX):

  • Equality: eq, neq
  • Numeric/datetime comparisons: gt, gte, lt, lte
  • Text/string matching: contains (case-insensitive)
  • Lists: in, nin (CSV list in valueX)
  • Ranges: between (use valueX as from,to)
  • Existence: exists is not supported for custom properties due to performance limitations. Use eq or neq instead.
  • status has a fixed set of values, so it supports only eq, neq, in, and nin.

Value formats:

  • in/nin: lists can be provided as:
    • Plain CSV: value1=OPEN,ACTIVE
    • Quoted CSV (to include commas inside a value): value1="Last, First",Other
    • JSON array: value1=["Last, First","Other"]
  • between: from,to (e.g., value1=2025-01-01,2025-12-31 or value1=10,20)
  • Dates should be ISO 8601 strings; numeric-like values on custom properties are matched against both numeric and text representations.

Examples:

  • status equals ACTIVE: ?prop1=status&op1=eq&value1=ACTIVE
  • custom id equals 1234: ?prop1=legacy_tool_project_id&op1=eq&value1=1234
  • title contains "Solar": ?prop1=name&op1=contains&value1=Solar
  • status IN (ACTIVE, ON_HOLD) AND city = Austin: ?prop1=status&op1=in&value1=ACTIVE,ON_HOLD&logic=and&prop2=city&op2=eq&value2=Austin

Note: If a project has no title (empty or whitespace-only), the response returns the parent account's title instead. The stored value is not modified — this is a read-time fallback only. Title-based search (title query param, full-text q, or the /projects/search endpoint with prop=title&op=contains) also matches projects whose own title is null/empty when the parent account's title matches the search term.

Supports date filtering (updated_after, updated_before), optionally widened to project-level line item edits via include_line_item_updates. updated_after/updated_before also match projects whose custom property values changed within the window.

get/projects/search

Request

  • Base URL: https://api.coperniq.io/v1
  • URL: https://api.coperniq.io/v1/projects/search
  • Auth: API key in header x-api-key

Query parameters

prop1string required

First field to filter (standard or custom keyName)

op1'eq' | 'neq' | 'gt' | 'gte' | 'lt' | 'lte' | 'contains' | 'in' | 'nin' | 'between' required

Operator for prop1

value1string required

Value for prop1 (comma-separated values for in/nin or between)

logic'and' | 'or'

Logical combination when both prop1 and prop2 are provided

prop2string

Optional second field to filter

op2'eq' | 'neq' | 'gt' | 'gte' | 'lt' | 'lte' | 'contains' | 'in' | 'nin' | 'between'

Operator for prop2

value2string

Value for prop2 (comma-separated values for in/nin or between)

page_sizeinteger

Number of items per page (max 100)

pageinteger

Page number (1-based)

string date
OR
string date-time

Filter items updated after this timestamp (ISO 8601). Also matches records whose custom property values changed within the window.

string date
OR
string date-time

Filter items updated before this timestamp (ISO 8601). Also matches records whose custom property values changed within the window.

include_line_item_updatesboolean

Requires updated_after and/or updated_before to also be passed — has no effect on its own. When true, widens that window to also match projects whose project-level line items (estimate/scope items) were added or edited in the window, and adds a lineItemsUpdatedAt field to each returned project (the most recent updatedAt among its own scope line items, null if none). Line items on quotes/invoices are excluded. Deletions and reorders are not detected. Ordering remains on the project's own updatedAt, so this flag is not a replacement for a full change-feed. Default: false. Only applies to project list/search endpoints.

entered_phase_idinteger

Phase template ID to filter by phase-entry date. Required when entered_after or entered_before is provided. Given alone (no date bounds), matches records that ever entered this phase.

entered_afterstring

Only include records that entered the phase given by entered_phase_id on or after this date/timestamp. Accepts a date (2026-07-01) or a full ISO 8601 timestamp (2026-07-01T00:00:00Z). Requires entered_phase_id.

entered_beforestring

Only include records that entered the phase given by entered_phase_id before this date/timestamp (exclusive). Accepts a date (2026-08-01) or a full ISO 8601 timestamp (2026-08-01T00:00:00Z). Requires entered_phase_id.

exited_phase_idinteger

Phase template ID to filter by phase-exit date. Required when exited_after or exited_before is provided. Given alone (no date bounds), matches records that have exited this phase at any point.

exited_afterstring

Only include records that exited the phase given by exited_phase_id on or after this date/timestamp. Accepts a date (2026-07-01) or a full ISO 8601 timestamp (2026-07-01T00:00:00Z). Requires exited_phase_id.

exited_beforestring

Only include records that exited the phase given by exited_phase_id before this date/timestamp (exclusive). Accepts a date (2026-08-01) or a full ISO 8601 timestamp (2026-08-01T00:00:00Z). Requires exited_phase_id. On opportunities, combine with exited_phase_id set to a "Closed - Won"-style phase template to find deals that closed within a date range.

order_by'asc' | 'desc'

Sort order for results

include_archivedboolean

Whether to include archived (inactive) records in the response. By default only active records are returned.

include_contactsboolean

Whether to include associated contacts in the response. Defaults to false unless explicitly set to true.

Response

List of projects matching filters

idinteger

Unique identifier

createdAtstring date-time

Creation timestamp

updatedAtstring date-time

Timestamp of the most recent update to the record, including changes to its custom property values.

titlestring

Record title/name

descriptionstring nullable

Record description

addressstring[]

Record location/address

isActiveboolean

Whether the record is active

primaryEmailstring email nullable

Primary contact email

primaryPhonestring nullable

Primary contact phone

numberinteger

Record number (e.g., 1234)

customobject

Custom fields

tradesTradeType[]

Array of trade types

valuenumber double nullable

Project value

sizenumber double nullable

Project size

workflowIdinteger nullable

Associated workflow ID

accountIdinteger nullable

Associated account ID

status'ACTIVE' | 'ON_HOLD' | 'CANCELLED' | 'COMPLETED'

Status of the project:

  • ACTIVE - Project is active and in progress
  • ON_HOLD - Project is temporarily paused
  • CANCELLED - Project has been cancelled
  • COMPLETED - Project has been completed
lineItemsUpdatedAtstring date-time nullable

Only present on GET /projects and /projects/search when include_line_item_updates=true is passed together with updated_after and/or updated_before. The most recent updatedAt among the project's own scope line items (estimate/scope items; line items on quotes/invoices are excluded). null if the project has no scope line items. Useful for telling whether a row matched the date window via its own updatedAt or via a line item edit.

workflowNamestring

Name of the associated workflow.

Changes

No recorded changes to this operation across all 1 revision of this API.