Skip to content

Milestones & Phases · Endpoints

Base URL: https://{yourcompany}.kendis.io/api/v1/… · Auth: HTTP Basic (email : API key). Examples use example.kendis.io. All responses use the Data (capital D) envelope.

Every route is addressed through its PI board: /api/v1/pi-boards/{boardId}/milestones/…. Take {boardId} from List Boards, never from the browser URL.

About the examples

The examples follow one fictional PI board at a motor insurer, PI 2026.4 Claims Modernisation, with a Claims UAT phase and two release milestones: Motor FNOL Go-Live and Solvency II Reporting Release. All names, keys and numbers are illustrative.


1. List Milestones and Phases of a board

GET /api/v1/pi-boards/{boardId}/milestones

Returns the milestones and phases linked to the board, ordered by date (a phase by its start date), then title. A milestone marks a single date; a phase spans a period from startDate to endDate. Both are measured the same way, and each row's type says which it is.

Parameter Type Required Default Description
type string No all all (milestones and phases), milestones or phases. Any other value is a 400.
fields string No all Comma-separated optional fields, or all
startAt int No 0 Pagination offset
pageLimit int No 50 Page size (max 50)
GET https://example.kendis.io/api/v1/pi-boards/<board-id>/milestones
Authorization: Basic <token>
{
  "startAt": 0,
  "pageLimit": 50,
  "total": 3,
  "Data": [
    {
      "id": "<phase-id>",
      "type": "Phase",
      "key": "P-7",
      "title": "Claims UAT",
      "startDate": 1794787200000,
      "endDate": 1796342400000,
      "color": "#16a085",
      "status": { "id": "<status-id>", "status": "In Progress", "category": "InProgress" },
      "criteria": "CHILDREN_LINKED_ITEM_STATUS",
      "criteriaSource": "milestone",
      "completionPct": 55.0,
      "completion": {
        "byLinkedItemStatus": 25.0,
        "byChildrenStatus": 55.0,
        "byChildrenEstimate": 55.32
      },
      "linkedItemsCount": 4,
      "collectionIds": ["<collection-id>"],
      "createdBy": "user@example.com",
      "updatedBy": "user@example.com",
      "createdOn": 1785748500000,
      "updatedOn": 1791211200000
    },
    {
      "id": "<milestone-id-1>",
      "type": "Milestone",
      "key": "M-21",
      "title": "Motor FNOL Go-Live",
      "date": 1795996800000,
      "color": "#2e86de",
      "status": { "id": "<status-id>", "status": "In Progress", "category": "InProgress" },
      "criteria": "CHILDREN_LINKED_ITEM_STATUS",
      "criteriaSource": "milestone",
      "completionPct": 44.44,
      "completion": {
        "byLinkedItemStatus": 0.0,
        "byChildrenStatus": 44.44,
        "byChildrenEstimate": 44.58
      },
      "linkedItemsCount": 3,
      "collectionIds": ["<collection-id>"],
      "createdBy": "user@example.com",
      "updatedBy": "user@example.com",
      "createdOn": 1785748500000,
      "updatedOn": 1791211200000
    },
    {
      "id": "<milestone-id-2>",
      "type": "Milestone",
      "key": "M-22",
      "title": "Solvency II Reporting Release",
      "date": 1797292800000,
      "color": "#8e44ad",
      "status": { "id": "<status-id>", "status": "Planned", "category": "ToDo" },
      "criteria": "CHILDREN_LINKED_ITEM_ESTIMATE",
      "criteriaSource": "milestone",
      "completionPct": 62.12,
      "completion": {
        "byLinkedItemStatus": 40.0,
        "byChildrenStatus": 60.0,
        "byChildrenEstimate": 62.12
      },
      "linkedItemsCount": 5,
      "collectionIds": ["<collection-id>"],
      "createdBy": "user@example.com",
      "updatedBy": "user@example.com",
      "createdOn": 1786359720000,
      "updatedOn": 1791275400000
    }
  ]
}

Each milestone and phase reports all three completion methods in completion, and completionPct is the one selected for it (named in criteria). See Milestone completion for how M-22's numbers are made up.

Use ?type=milestones for M-21 and M-22 only, or ?type=phases for P-7 only.

2. Get a single Milestone or Phase

GET /api/v1/pi-boards/{boardId}/milestones/{keyOrId}

keyOrId is the key of a milestone (e.g. M-21) or a phase (e.g. P-7), or its internal ID. Accepts fields. Returns a single Milestone or Phase object inside Data. 404 if it is not linked to this board; an objective or key result key on this route is also a 404.

3. List cards linked to a Milestone or Phase

GET /api/v1/pi-boards/{boardId}/milestones/{keyOrId}/linked-items

Same parameters (expand, startAt, pageLimit) and card shape as the linked card reference, for a milestone or a phase. These are the cards its completion is calculated from.

GET https://example.kendis.io/api/v1/pi-boards/<board-id>/milestones/M-21/linked-items?expand=children
Authorization: Basic <token>
{
  "startAt": 0,
  "pageLimit": 50,
  "total": 3,
  "Data": [
    {
      "id": "<card-id-1>",
      "almKey": "FEA-412",
      "title": "Online claim submission portal",
      "cardType": "Feature",
      "almType": "Feature",
      "status": { "id": "<status-id>", "status": "In Progress", "category": "InProgress" },
      "storyPoints": 0.0,
      "url": "https://your-jira.example.com/browse/FEA-412",
      "teamsAndSprints": [
        {
          "team":   { "id": "<team-id>", "title": "Team Claims", "label": "CLM" },
          "sprint": { "id": "<sprint-id>", "title": "Iteration 2", "label": "S2", "startDate": 1793577600000, "endDate": 1794528000000, "isIPSprint": false }
        }
      ],
      "childrenSummary": { "totalItems": 8, "doneItems": 5, "totalStoryPoints": 40.0, "doneStoryPoints": 26.0, "progressPct": 62.5, "progressPctByStoryPoints": 65.0 },
      "children": [ ]
    },
    {
      "id": "<card-id-2>",
      "almKey": "FEA-415",
      "title": "Fraud scoring at claim intake",
      "cardType": "Feature",
      "almType": "Feature",
      "status": { "id": "<status-id>", "status": "In Progress", "category": "InProgress" },
      "storyPoints": 0.0,
      "url": "https://your-jira.example.com/browse/FEA-415",
      "teamsAndSprints": [
        {
          "team":   { "id": "<team-id-2>", "title": "Team Fraud Analytics", "label": "FRD" },
          "sprint": { "id": "<sprint-id-2>", "title": "Iteration 3", "label": "S3", "startDate": 1794787200000, "endDate": 1795737600000, "isIPSprint": false }
        }
      ],
      "childrenSummary": { "totalItems": 6, "doneItems": 2, "totalStoryPoints": 30.0, "doneStoryPoints": 8.0, "progressPct": 33.33, "progressPctByStoryPoints": 26.67 },
      "children": [ ]
    },
    {
      "id": "<card-id-3>",
      "almKey": "FEA-418",
      "title": "Claim status notifications for policyholders",
      "cardType": "Feature",
      "almType": "Feature",
      "status": { "id": "<status-id>", "status": "To Do", "category": "ToDo" },
      "storyPoints": 0.0,
      "url": "https://your-jira.example.com/browse/FEA-418",
      "teamsAndSprints": [ ],
      "childrenSummary": { "totalItems": 4, "doneItems": 1, "totalStoryPoints": 13.0, "doneStoryPoints": 3.0, "progressPct": 25.0, "progressPctByStoryPoints": 23.08 },
      "children": [ ]
    }
  ]
}

None of the three Features is Done yet (byLinkedItemStatus 0%), but 8 of their 18 stories are (byChildrenStatus 44.44%), covering 37 of 83 story points (byChildrenEstimate 44.58%). children arrays are shortened here.

For P-7 Claims UAT the same route returns its four cards: FEA-412 and FEA-415 from the example above, FEA-430 Quarterly QRT data extract, and STORY-1210 Regression pack for claims workflows, which is already Done.

A milestone or phase can be linked to a card from the PI board itself or from the card's collection. Either way the card is returned once, and only while it is on the board. total and linkedItemsCount count those cards. With expand=children, sub-items are listed for Feature-level cards; a story linked directly to a milestone or phase has no children.


Field selection

The list and single-item routes take fields:

Usage Result
omitted, or ?fields=all Every available field
?fields=description,collectionIds The core fields plus only the listed optional ones

The core and optional fields are listed in the field reference. The linked-items route has a fixed card shape and does not take fields.

Status codes

Code Meaning
200 Success
400 Invalid parameter (e.g. an unknown type, or pageLimit=abc), or the board's objectives live in the legacy objectives view
401 Missing or invalid API key
404 Board, milestone or phase not found, or not accessible to the API user
500 Internal server error

Error bodies are { "error": "..." }.

Quick reference

Action Method Path
Find board IDs GET /api/v1/boards
Milestones and Phases of a board GET /api/v1/pi-boards/{boardId}/milestones[?type=all\|milestones\|phases]
Get Milestone or Phase GET /api/v1/pi-boards/{boardId}/milestones/{keyOrId}
Cards linked to a Milestone or Phase GET /api/v1/pi-boards/{boardId}/milestones/{keyOrId}/linked-items

All URLs: https://{yourcompany}.kendis.io + the path above.