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. 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.

Authentication

x-api-keystring
API Key authentication via header

Query parameters

prop1stringRequired

First field to filter (standard or custom keyName)

op1enumRequired
Operator for prop1
value1stringRequired

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

logicenumOptionalDefaults to and
Logical combination when both prop1 and prop2 are provided
Allowed values:
prop2stringOptional
Optional second field to filter
op2enumOptional
Operator for prop2
value2stringOptional

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

page_sizeintegerOptional1-100Defaults to 20

Number of items per page (max 100)

pageintegerOptional>=1Defaults to 1

Page number (1-based)

updated_afterstringOptional

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

updated_beforestringOptional

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

include_line_item_updatesbooleanOptionalDefaults to false
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_idintegerOptional

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_afterstringOptional

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_beforestringOptional

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_idintegerOptional

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_afterstringOptional

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_beforestringOptional
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_byenumOptionalDefaults to asc
Sort order for results
Allowed values:
include_archivedbooleanOptionalDefaults to false

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

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

Response

List of projects matching filters
idintegerOptional
Unique identifier
createdAtstringOptionalformat: "date-time"
Creation timestamp
updatedAtstringOptionalformat: "date-time"
Timestamp of the most recent update to the record, including changes to its custom property values.
titlestringOptional

Record title/name

descriptionstring or nullOptional
Record description
addresslist of stringsOptional

Record location/address

isActivebooleanOptional
Whether the record is active
primaryEmailstring or nullOptionalformat: "email"
Primary contact email
primaryPhonestring or nullOptional
Primary contact phone
numberintegerOptional

Record number (e.g., 1234)

createdByobject or nullOptional

User who created the record. Null when the record was created by a non-user actor (e.g. automation or a contact).

updatedByobject or nullOptional

User who last edited a field on the record, derived from the changelog. Null when the record has never been edited or the last edit was made by a non-user actor.

custommap from strings to anyOptional
Custom fields
tradeslist of enumsOptional
Array of trade types
valuedouble or nullOptional
Project value
sizedouble or nullOptional
Project size
workflowIdinteger or nullOptional
Associated workflow ID
accountIdinteger or nullOptional
Associated account ID
statusenumOptional

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
stageobjectOptional

Current stage information (Workflows 1.0).

This object is present only for records still using the original Stage-based workflow engine. When the project is managed by Workflows 2.0 (Phase engine) the stage object and related fields (stageId, timeInStageDays, slaStatus) are omitted.

phaseobjectOptional

Current phase information (Workflows 2.0).

This object replaces stage when a project is attached to the Phase-based workflow engine. If the project is still on Workflows 1.0 this object will be omitted. Only populated on GET (list, search, get by id) — omitted on create/update responses.

phaseTimelinelist of objectsOptional

Only present on GET /projects and /projects/search when entered_phase_id/exited_phase_id is used to filter the results. Contains the project’s full phase-transition history (not just the matched phase) in compact form — use GET /projects/{project_id} for the complete phaseInstances with names, positions, and SLA info.

lineItemsUpdatedAtstring or nullOptionalformat: "date-time"

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.

workflowNamestringOptional
Name of the associated workflow.
contactslist of objectsOptional

Contacts associated with this project (independent of, and not inherited from, the parent account’s contacts). Set on create or update via the contacts request field. On GET requests, only populated when include_contacts=true is passed. Always populated on POST (create) and PATCH (update) responses. Ordered with the primary contact first, capped at 20 contacts.

Errors

400
Bad Request Error
401
Unauthorized Error