---
title: "List milestones for a project"
method: GET
path: "/projects/{project_id}/project_milestones"
tags: ["Project milestones"]
---

# List milestones for a project

`GET /projects/{project_id}/project_milestones`

## Request

- Base URL: `https://api.pipelinecrm.com/api/v3`
- URL: `https://api.pipelinecrm.com/api/v3/projects/{project_id}/project_milestones`
- Auth: one of:
  - HTTP bearer
  - HTTP bearer and API key in header `app-key`
  - API key in query parameter `api_key` and API key in query parameter `app_key`

## Path parameters

- `project_id` integer, required

## Response `200`

Successful Response

- object
  - `entries` ProjectMilestoneAll[], required
    - `id` integer: Unique identifier
    - `project_id` integer: The ID of the parent [project](#tag/projects). Read-only — set by the URL or by `project_id` in the create request body.
    - `created_by_user_id` integer, nullable: The ID of the [user](#tag/users) who created this milestone
    - `project_name` string: The name of the parent project
    - `created_by_user` object, nullable: A convenience object for the [user](#tag/users) who created this milestone
      - `id` integer
      - `first_name` string
      - `last_name` string
    - `status` object: The [milestone status](#tag/project-milestone-statuses) of this milestone
      - `id` integer
      - `name` string
      - `hex_color` string
      - `status_type` 'custom' | 'not_started' | 'in_progress' | 'blocked' | 'done'
    - `project` object: A convenience object for the parent [project](#tag/projects)
      - `id` integer
      - `name` string
      - `description` string
      - `status` 'open' | 'closed'
      - `start_date` string
      - `end_date` string
      - `owner_id` integer
      - `owner` object: The project owner
        - `id` integer
        - `first_name` string
        - `last_name` string
        - `full_name` string
    - `milestone_tasks` object[]: Tasks associated with this milestone
      - `id` integer
      - `type` string: The calendar entry type (always CalendarTask for tasks)
      - `name` string
      - `due_date` string
      - `start_time` string, nullable: Always null for tasks
      - `end_time` string, nullable: Always null for tasks
      - `complete` boolean
      - `owner_id` integer
      - `owner` object
        - `id` integer
        - `full_name` string
    - `milestone_events` object[]: Events associated with this milestone
      - `id` integer
      - `type` string: The calendar entry type (always CalendarEvent for events)
      - `name` string
      - `start_time` string: Combined start datetime
      - `end_time` string: Combined end datetime
      - `start_time_date` string: Date portion of start time (for form editing)
      - `start_time_time` string: Time portion of start time (for form editing)
      - `end_time_date` string: Date portion of end time (for form editing)
      - `end_time_time` string: Time portion of end time (for form editing)
      - `all_day` boolean
      - `complete` boolean
      - `owner_id` integer
      - `owner` object
        - `id` integer
        - `full_name` string
    - `created_at` string: Timestamp when the record was created (time zone in user's time zone).
    - `updated_at` string: Timestamp when the record was last touched (time zone in user's time zone).
    - `name` string: The name of the milestone. Must be unique within the project.
    - `project_milestone_status_id` integer: The ID of the [project milestone status](#tag/project-milestone-statuses). Defaults to the "Not Started" status if not provided.
    - `start_date` string, nullable: The start date of the milestone (YYYY-MM-DD format)
    - `end_date` string, nullable: The end date of the milestone (YYYY-MM-DD format). Must be after start_date.
    - `milestone_tasks_attributes` object[]: Nested task attributes for creating/updating tasks inline with the milestone
      - `id` integer: Task ID (required for updates, omit for new tasks)
      - `name` string
      - `due_date` string
      - `owner_id` integer: The ID of the [user](#tag/users) who owns this task
      - `_destroy` boolean: Set to true to remove this task
    - `milestone_events_attributes` object[]: Nested event attributes for creating/updating events inline with the milestone
      - `id` integer: Event ID (required for updates, omit for new events)
      - `name` string
      - `start_time_date` string: The date portion of the event start time
      - `start_time_time` string: The time portion of the event start time (HH:MM format)
      - `end_time_date` string: The date portion of the event end time
      - `end_time_time` string: The time portion of the event end time (HH:MM format)
      - `all_day` boolean: Whether this is an all-day event
      - `owner_id` integer: The ID of the [user](#tag/users) who owns this event
      - `_destroy` boolean: Set to true to remove this event
  - `pagination` Pagination, required: Paging details returned alongside `entries` on every paginated list.
    - `page` integer: The page returned. Request another with `?page=N`.
    - `per_page` integer: Page size. `?per_page=N`, capped at 200.
    - `total` integer: Total number of records matching the request across all pages.
    - `pages` integer: Number of pages at this `per_page`.
    - `total_in_account` integer, nullable: Total number of records of this type visible to you before filters were applied. Null when not computed for the endpoint.
    - `page_var` string: Name of the query parameter that selects the page. Always `page`.
    - `url` string, nullable: Path of the request, when the endpoint reports it.

## Other responses

- `401`: Missing, invalid, expired or revoked credentials.
- `404`: No record with that id is visible to this user. Records owned by other users that you cannot see also answer 404.

---

[API](https://skmtc.dev/pipelinecrm/apis/pipeline-crm-api.md) · [All operations](https://skmtc.dev/pipelinecrm/apis/pipeline-crm-api/llms.txt) · [OpenAPI document](https://skmtc.dev/pipelinecrm/apis/pipeline-crm-api/revisions/53ebfcc83597?raw)
