List Projects
Retrieve a paginated list of projects.
Supports:
- Pagination (
page_size,page) - Date filtering (
updated_after,updated_before, optionally widened to project-level line item edits viainclude_line_item_updates) - Phase entry/exit date filtering (
entered_phase_id+entered_after/entered_before,exited_phase_id+exited_after/exited_before) - Sorting (
order_by) - Field search (
title,address,primaryName,primaryPhone,primaryEmail) - Full text search (
q)
Note: updated_after/updated_before also match projects whose custom property values changed within the window.
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.
Note: entered_phase_id/exited_phase_id identify a phase template (shared across all projects on a workflow), not a specific phase instance. Use the phaseTemplateId from a GET /projects/{project_id} response to find the id for a given phase. When either filter is used, each row also includes a compact phaseTimeline (phaseTemplateId, startedAt, completedAt); use GET /projects/{project_id} for the full phaseInstances with names/positions/SLA.
Authentication
Query parameters
Number of items per page (max 100)
Page number (1-based)
Filter items updated after this timestamp (ISO 8601). Also matches records whose custom property values changed within the window.
Filter items updated before this timestamp (ISO 8601). Also matches records whose custom property values changed within the window.
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.
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.
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.
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.
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.
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.
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.
Whether to include archived (inactive) records in the response. By default only active records are returned.
Response
Record title/name
Record location/address
Record number (e.g., 1234)
User who created the record. Null when the record was created by a non-user actor (e.g. automation or a contact).
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.
Status of the project:
ACTIVE- Project is active and in progressON_HOLD- Project is temporarily pausedCANCELLED- Project has been cancelledCOMPLETED- Project has been completed
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.
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.
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.
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.
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.
