Skip to content

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.

GET https://example.kendis.io/api/v1/strategic-themes/CV-20/progress
Authorization: Basic <token>
{
  "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.

GET https://example.kendis.io/api/v1/objectives/OBJ-329?fields=all
Authorization: Basic <token>

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.

GET https://example.kendis.io/api/v1/key-results/KR-141?fields=all
Authorization: Basic <token>

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.