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) |
{
"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.