---
title: "List projects"
method: GET
path: "/projects"
tags: ["Objects"]
---

# List projects

`GET /projects`

Returns a paginated list of projects. Supports cursor pagination, full-text search (title, number, description), and filtering by status, type, pipeline, stage, client, or project lead.

## Query parameters

- `cursor` string
- `pageSize` integer
- `search` string
- `status` 'ACTIVE' | 'COMPLETED' | 'CANCELLED'
- `type` 'flat_rate' | 'retainer'
- `pipelineId` string
- `stageId` string
- `clientId` string
- `projectLeadId` string

## Response `200`

OK

- object
  - `data` Project[], required
    - `id` string, nullable, required — Project ID (prj_ prefix)
    - `number` string, required — Auto-generated project number
    - `title` string, required — Project title
    - `status` 'ACTIVE' | 'COMPLETED' | 'CANCELLED', nullable — Project status
    - `type` 'flat_rate' | 'retainer', nullable — Project type
    - `startDate` string, date-time, nullable — Project start date
    - `endDate` string, date-time, nullable — Project end date
    - `pipelineId` string, nullable — Project pipeline ID (ppl_ prefix)
    - `pipelineName` string, nullable — Pipeline name
    - `stageId` string, nullable — Project pipeline stage ID (pps_ prefix)
    - `stageName` string, nullable — Stage name
    - `projectLeadId` string, nullable — Project lead user ID (usr_ prefix)
    - `projectLeadName` string, nullable — Project lead name
    - `clientId` string, nullable — Client ID (clt_ prefix)
    - `clientName` string, nullable — Client name
    - `description` string, nullable — Project description
    - `budgetedHours` number, nullable — Budgeted hours
    - `createdAt` string, date-time, nullable — When the project was created
    - `updatedAt` string, date-time, nullable — When the project was last updated
  - `meta` ListMeta, required
    - `nextCursor` string, nullable — Cursor to fetch the next page. Null if there are no more results.
    - `hasMore` boolean, required — Whether additional results are available

## Other responses

- `400` — Validation error or bad request
- `401` — Missing or invalid API key
- `403` — Insufficient permission
- `404` — Resource not found
- `429` — Rate limit exceeded

---

[API](https://skmtc.net/heffl/apis/heffl-api-v2-beta.md) · [All operations](https://skmtc.net/heffl/apis/heffl-api-v2-beta/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/heffl/heffl-api-v2-beta/versions/27006cfef4d8/schema)
