Endpoints
# Strategic Themes & OKRs — Endpoints
Base URL: https://{yourcompany}.kendis.io/api/v1/… · Auth: HTTP Basic (email : API key). Examples use example.kendis.io. All list responses use the Data (capital D) envelope.
Common query parameters on list endpoints:
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
fields |
string | No | minimal |
Comma-separated fields, or all |
startAt |
int | No | 0 |
Pagination offset |
pageLimit |
int | No | 50 |
Page size (max 50) |
Detail endpoints accept only fields. All {keyOrId} parameters accept the item's key or internal ID.
1. List Portfolio Themes¶
GET /api/v1/portfolio-themes
GET https://example.kendis.io/api/v1/portfolio-themes?fields=all&startAt=0&pageLimit=50
Authorization: Basic <token>
{
"startAt": 0,
"pageLimit": 50,
"total": 3,
"Data": [
{ "key": "portfolio-10", "title": "Next-Gen Tech Innovation", "id": "64a1b2c3..." }
]
}
2. Get a single Portfolio Theme¶
GET /api/v1/portfolio-themes/{keyOrId}
keyOrId — the Portfolio Theme's key (e.g. portfolio-10) or internal ID.
GET https://example.kendis.io/api/v1/portfolio-themes/portfolio-10?fields=all
Authorization: Basic <token>
Returns a single Portfolio Theme object inside Data. 404 if not found.
3. List Strategic Themes in a Portfolio Theme¶
GET /api/v1/portfolio-themes/{keyOrId}/strategic-themes
GET https://example.kendis.io/api/v1/portfolio-themes/portfolio-14/strategic-themes?fields=all
Authorization: Basic <token>
{
"startAt": 0, "pageLimit": 50, "total": 4,
"Data": [
{ "id": "69a14f04...", "key": "CV-20", "title": "Digital Claims Excellence." }
]
}
4. List all Strategic Themes¶
GET /api/v1/strategic-themes
GET https://example.kendis.io/api/v1/strategic-themes?fields=all&startAt=0&pageLimit=50
Authorization: Basic <token>
{
"startAt": 0, "pageLimit": 50, "total": 16,
"Data": [
{
"id": "69a14f04...",
"key": "CV-20",
"title": "Digital Claims Excellence.",
"status": { "id": "67becd5d...", "status": "In Progress" },
"owners": ["6687db0b...", "6687db14..."]
}
]
}
5. Get a single Strategic Theme¶
GET /api/v1/strategic-themes/{keyOrId}
keyOrId — the Strategic Theme's key (e.g. CV-20) or internal ID. Returns one object inside Data. 404 if not found.
6. List Objective Groups in a Strategic Theme¶
GET /api/v1/strategic-themes/{keyOrId}/objective-groups
Returns the Objective Groups within a Strategic Theme, including completion percentages.
GET https://example.kendis.io/api/v1/strategic-themes/CV-20/objective-groups?fields=all
Authorization: Basic <token>
{
"startAt": 0, "pageLimit": 50, "total": 5,
"Data": [
{
"id": "69a14f13...",
"level": 1,
"type": "Objective Group",
"title": "Claims Intake Modernization",
"completionPct": 17.79,
"objectivesCount": 10,
"sequence": 3490568843.0,
"status": { "id": "6687dccb...", "status": "Planned" }
}
]
}
7. Get Strategic Theme progress¶
GET /api/v1/strategic-themes/{keyOrId}/progress
Returns overall theme progress plus per-group progress.
{
"Data": {
"themeProgress": 21.58,
"groupsProgress": {
"69a19d4b...": 20.0,
"69a14f13...": 14.35,
"69a19d71...": 28.33
}
}
}
8. List Objectives in an Objective Group¶
GET /api/v1/objective-groups/{groupId}/objectives
groupId — the Objective Group's internal ID.
GET https://example.kendis.io/api/v1/objective-groups/69adc9b1.../objectives?fields=all
Authorization: Basic <token>
{
"startAt": 0, "pageLimit": 50, "total": 4,
"Data": [
{
"id": "69c91775...",
"level": 2,
"type": "Objective",
"key": "OBJ-329",
"title": "test",
"completionPct": 30.0,
"timePeriod": "H2 2026",
"status": { "id": "6687dccb...", "status": "Planned" },
"bvPlan": 0.0,
"bvActual": 0.0,
"completionCriteria": "ROLLUP_BY_STATUS",
"groupName": "Temp",
"keyResultsCount": 0,
"linkedItems": [ { "id": "668fe17d...", "linkType": "backLogItem" } ]
}
]
}
9. Get a single Objective¶
GET /api/v1/objectives/{keyOrId}
keyOrId — the Objective's key (e.g. OBJ-329) or internal ID.
Returns one Objective object inside Data. 404 if not found.
10. List Key Results for an Objective¶
GET /api/v1/objectives/{keyOrId}/key-results
keyOrId — the Objective's key (e.g. OBJ-330) or internal ID.
GET https://example.kendis.io/api/v1/objectives/OBJ-330/key-results?fields=all
Authorization: Basic <token>
{
"startAt": 0, "pageLimit": 50, "total": 3,
"Data": [
{
"id": "69c91d12...",
"level": 3,
"type": "Key Result",
"key": "KR-141",
"title": "KR with items",
"completionPct": 30.0,
"criteria": "By Items",
"timePeriod": "H2 2026",
"status": { "id": "6687dccb...", "status": "Planned" }
},
{
"id": "69c91ed2...",
"level": 3,
"type": "Key Result",
"key": "KR-142",
"title": "New KR",
"completionPct": 28.0,
"criteria": "Target",
"timePeriod": "H2 2026",
"metric": { "baseline": 50, "target": 75, "unit": "%", "current": 57 }
}
]
}
11. Get a single Key Result¶
GET /api/v1/key-results/{keyOrId}
keyOrId — the Key Result's key (e.g. KR-141) or internal ID.
Returns one Key Result object inside Data. 404 if not found.
12. List linked work items of an Objective¶
GET /api/v1/objectives/{keyOrId}/linked-items
Returns the full details of the work items (Kendis cards and ALM-synced cards) linked to an Objective, including every custom field configured for cards in your company.
keyOrId — the Objective's key (e.g. OBJ-332) or internal ID.
| Query parameter | Description |
|---|---|
expand=children |
Also return each card's complete child hierarchy — every level, nested (e.g. Capability → Epic → Feature → Story) — plus a childrenSummary progress block |
startAt / pageLimit |
Standard pagination over the linked cards (default 0 / 50, max 50). With expand=children we recommend pageLimit=10 or lower — child trees are returned in full per card, so smaller pages keep responses fast and compact |
GET https://example.kendis.io/api/v1/objectives/OBJ-332/linked-items?expand=children
Authorization: Basic <token>
{
"startAt": 0, "pageLimit": 50, "total": 4,
"Data": [
{
"id": "67321c60...",
"kendisKey": "K-68",
"title": "My Example Card",
"cardType": "Feature",
"status": { "id": "6687d804...", "status": "Open", "category": "ToDo" },
"storyPoints": 5.0,
"releaseTrain": { "id": "668fe062...", "title": "Release Train 1" },
"createdOn": 1731337312029,
"updatedOn": 1787512844128,
"customFields": [
{ "id": "6690dcdb...", "title": "PI Name", "type": "singleselect", "value": "PI-2" },
{ "id": "67322304...", "title": "Target Date", "type": "datepicker", "value": "2026-11-18T15:33:00.000Z" }
],
"childrenSummary": {
"totalItems": 3, "doneItems": 2,
"totalStoryPoints": 6.0, "doneStoryPoints": 6.0,
"progressPct": 66.67, "progressPctByStoryPoints": 100.0
},
"children": [
{
"id": "67321e69...", "kendisKey": "K-69", "title": "Child story",
"status": { "id": "6687d804...", "status": "Done", "category": "Done" },
"storyPoints": 3.0,
"children": []
}
]
}
]
}
Cards synced from Jira / Azure DevOps carry almKey (e.g. CAP-5) and url (deep link to the
card in the ALM tool) instead of — or in addition to — kendisKey.
Every node in children nests its own children array; an empty array marks a lowest-level item.
childrenSummary percentages are computed from those lowest-level items only — the same items
the OKR progress roll-up counts — so they always reconcile with the Objective's completionPct.
Items whose status category is Misc appear in the tree but are excluded from the percentages.
In the rare case the server cannot resolve a card's children, that card carries
"childrenError": true with an empty children array and no childrenSummary — so a
resolution failure can never be mistaken for "this card has no children".
See the field reference for every field. 404 if the
Objective is not found.
13. List linked work items of a Key Result¶
GET /api/v1/key-results/{keyOrId}/linked-items
Key Results link work items exactly the same way Objectives do, so this route returns the
identical response to §12 — same card fields,
same customFields, same expand=children child hierarchy and childrenSummary, same
pagination (and the same pageLimit=10 recommendation with expand=children).
keyOrId — the Key Result's key (e.g. KR-141) or internal ID.
GET https://example.kendis.io/api/v1/key-results/KR-141/linked-items?expand=children
Authorization: Basic <token>
404 if the Key Result is not found.