Skip to content

API Reference ​

kendo provides an API for programmatic access and an MCP (Model Context Protocol) server for AI coding assistants.

Authentication ​

kendo has two kinds of token. Use a personal API token for your own programmatic access, and a project token when an external system needs to submit data to a single project.

Personal API Tokens ​

Personal tokens authenticate requests on your behalf and carry read + write scopes — they reach every endpoint your account can, subject to your role and team access. Create them from your profile settings and include the token in the Authorization header:

bash
curl https://{tenant}.kendo.dev/api/projects \
  -H "Authorization: Bearer your-api-token"

Tokens can be revoked at any time from your profile. See API Tokens for scopes and details.

Project Tokens ​

Project tokens are scoped to a single project. A project token has an access level, Read or Read & write, and reaches the project's normal endpoints as the member who created it. Submitting reports or ingesting error events or token events takes Read & write. They exist for external systems — dashboards, CI pipelines, feedback widgets, error reporters — that work with one project and reach nothing else. Mint them from the project's settings; see Project Tokens.

Personal API tokenProject token
ScopeYour whole accountOne project
AccessThe general API, per your roleThe project's endpoints, at Read or Read & write
Created fromProfile settingsProject settings, or the API
ForYour own scripts and integrationsExternal systems that work with one project

Base URL ​

All API endpoints are relative to your tenant subdomain:

https://{tenant}.kendo.dev/api/

Resources ​

ResourceDescription
IssuesCreate, update, move, and search issues
ProjectsManage projects and their configuration
SprintsPlan, activate, and complete sprints
Time EntriesLog and manage time against issues
CommentsAdd and manage comments on issues
EpicsGroup issues on a timeline
MembersList a project's members and their user IDs
RolesManage roles and permissions
UsersList and manage workspace members
NotificationsList and manage your notification inbox
Branch LinksLink GitHub branches to issues
ReportsSubmit, promote, and manage feedback reports
Error EventsIngest application errors, deduplicated into error groups
Token EventsRecord the AI token usage of an agent session on an issue
Project TokensScoped tokens for external systems — one project, at Read or Read & write
API TokensPersonal access tokens — full API access for your own account

Additional Endpoints ​

MethodEndpointDescription
GET/api/projects/{id}/lanesList board lanes
GET/api/projects/{id}/lanes/github-triggersList lane GitHub triggers
PUT/api/projects/{id}/lanes/github-triggersReplace all lane GitHub triggers
GET/api/teamsList teams
GET/api/github/statusCheck GitHub connection
GET/api/projects/{id}/github-reposList linked repositories

Lane GitHub Triggers ​

A lane GitHub trigger moves an issue into a lane when a GitHub event fires on a branch linked to that issue. It works in one direction only: moving an issue into a lane sends nothing to GitHub. Triggers run on webhooks, so the workspace needs the GitHub App.

MethodEndpointRequired PermissionToken scope
GET/api/projects/{id}/lanes/github-triggersLanes: Readread or write
PUT/api/projects/{id}/lanes/github-triggersProjects: Update (Own/All)write

Both endpoints also require access to the project.

Event Types ​

event_types holds integers:

ValueEventFires when
0Branch CreatedA branch is created in a linked repository. kendo first links it to the issue whose key is in the branch name.
1PR OpenedA pull request is opened from a linked branch. Reopening a pull request does not fire it.
2PR Ready for ReviewA draft pull request from a linked branch is marked ready for review.
3PR MergedA pull request from a linked branch is merged.
4PR ClosedA pull request from a linked branch is closed without merging.

When an event fires, each issue linked to the branch moves into the lane that holds that event type. An issue already in that lane is left unchanged. When an issue does move and has no assignee, it is also assigned to the GitHub user who caused the event, if that user has connected their GitHub account to kendo.

List Triggers ​

GET /api/projects/{id}/lanes/github-triggers

Returns an object keyed by lane id. Each value lists the event types on that lane. Lanes without triggers are left out.

bash
curl https://{tenant}.kendo.dev/api/projects/3/lanes/github-triggers \
  -H "Authorization: Bearer your-token"
json
{
  "12": [0, 1],
  "14": [3]
}

When the project has no triggers, the response is an empty array [], not an empty object.

The lanes list (GET /api/projects/{id}/lanes) carries the same data on each lane as github_trigger_event_types.

Replace Triggers ​

PUT /api/projects/{id}/lanes/github-triggers

Replaces the project's whole trigger set in one transaction. Returns 204 No Content on success.

FieldTypeRequiredDescription
triggersarrayYesThe full trigger set. Send [] to remove every trigger
triggers[].lane_idintegerYesA lane of this project
triggers[].event_typesinteger[]YesAt least one event type, no duplicates
bash
curl -X PUT https://{tenant}.kendo.dev/api/projects/3/lanes/github-triggers \
  -H "Authorization: Bearer your-token" \
  -H "Content-Type: application/json" \
  -d '{
    "triggers": [
      {"lane_id": 12, "event_types": [0, 1]},
      {"lane_id": 14, "event_types": [3]}
    ]
  }'
  • The set is replaced, not merged. A lane you leave out loses its triggers. To clear one lane, leave it out; an entry with an empty event_types is rejected.
  • One event type, one lane. Putting the same event type on two lanes returns 422 with Each event type can only be assigned to one lane.

Response Format ​

All responses return JSON. Successful responses return the resource directly:

json
{
  "id": 1,
  "title": "...",
  "created_at": "2026-03-13T10:30:00.000000Z"
}

Collection endpoints return arrays:

json
[
  {"id": 1, "title": "..."},
  {"id": 2, "title": "..."}
]

Status Codes ​

CodeMeaning
200Success (retrieve, update, list)
201Created (store)
204No Content (delete)
422Validation Error (invalid input)

Validation Errors ​

When validation fails, the API returns a 422 response with field-level errors:

json
{
  "message": "The title field is required.",
  "errors": {
    "title": ["The title field is required."],
    "priority": ["The selected priority is invalid."]
  }
}

Authorization & Scoping ​

All API and MCP access is scoped to the authenticated user:

  • API tokens are user-specific — you only see projects, issues, and data for projects assigned to your teams
  • MCP tokens carry an mcp:use scope with the same access restrictions
  • This isn't just filtering — it's programmatic enforcement through Laravel Gates and Project::accessibleBy($user) checks
  • Role-based permissions apply per-resource, per-action: each role defines Create, Read, Update (None/Own/All), and Delete (None/Own/All) scopes for 16 resources
  • Project owners automatically get full access to all project-scoped resources in their own projects
  • Admins bypass all permission checks

MCP Server ​

kendo exposes a Model Context Protocol server with tools and resources for AI coding assistants.

For full documentation including setup guides, tool parameters, and workflow examples, see the MCP documentation.

SectionWhat's Covered
Overview & SetupOAuth flow, Claude Code and Cursor configuration
IssuesCreate one or many, update, search, prepare context, pick up, daily snapshot (10 tools)
CommentsAdd, update, delete with permission model (3 tools)
Time EntriesLog, update, delete, query with grouping (4 tools)
Token UsageRecord an agent session's token usage per model (1 tool)
EpicsCreate, update, delete, get with progress, tick and untick wishes (6 tools)
LabelsList, create, update, delete labels, and set an issue's labels (5 tools)
SprintsList, create, update, complete, delete, bulk-assign issues (6 tools)
BranchesLink and unlink branches with multi-repo disambiguation (2 tools)
Resources10 read-only resources for projects, issues, lanes, sprints, epics, members, teams, repos
WorkflowsMulti-step flows: sprint planning, bug triage, time logging

Build Integrations ​

Use the API to connect any chat tool, CI pipeline, or internal system to your project board:

  • Create issues from Slack, Discord, or Microsoft Teams messages
  • Post board updates to a channel
  • Sync status with external dashboards
  • Trigger workflows based on issue events

See Also ​