Appearance
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 token | Project token | |
|---|---|---|
| Scope | Your whole account | One project |
| Access | The general API, per your role | The project's endpoints, at Read or Read & write |
| Created from | Profile settings | Project settings, or the API |
| For | Your own scripts and integrations | External systems that work with one project |
Base URL
All API endpoints are relative to your tenant subdomain:
https://{tenant}.kendo.dev/api/Resources
| Resource | Description |
|---|---|
| Issues | Create, update, move, and search issues |
| Projects | Manage projects and their configuration |
| Sprints | Plan, activate, and complete sprints |
| Time Entries | Log and manage time against issues |
| Comments | Add and manage comments on issues |
| Epics | Group issues on a timeline |
| Members | List a project's members and their user IDs |
| Roles | Manage roles and permissions |
| Users | List and manage workspace members |
| Notifications | List and manage your notification inbox |
| Branch Links | Link GitHub branches to issues |
| Reports | Submit, promote, and manage feedback reports |
| Error Events | Ingest application errors, deduplicated into error groups |
| Token Events | Record the AI token usage of an agent session on an issue |
| Project Tokens | Scoped tokens for external systems — one project, at Read or Read & write |
| API Tokens | Personal access tokens — full API access for your own account |
Additional Endpoints
| Method | Endpoint | Description |
|---|---|---|
GET | /api/projects/{id}/lanes | List board lanes |
GET | /api/projects/{id}/lanes/github-triggers | List lane GitHub triggers |
PUT | /api/projects/{id}/lanes/github-triggers | Replace all lane GitHub triggers |
GET | /api/teams | List teams |
GET | /api/github/status | Check GitHub connection |
GET | /api/projects/{id}/github-repos | List 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.
| Method | Endpoint | Required Permission | Token scope |
|---|---|---|---|
GET | /api/projects/{id}/lanes/github-triggers | Lanes: Read | read or write |
PUT | /api/projects/{id}/lanes/github-triggers | Projects: Update (Own/All) | write |
Both endpoints also require access to the project.
Event Types
event_types holds integers:
| Value | Event | Fires when |
|---|---|---|
0 | Branch Created | A branch is created in a linked repository. kendo first links it to the issue whose key is in the branch name. |
1 | PR Opened | A pull request is opened from a linked branch. Reopening a pull request does not fire it. |
2 | PR Ready for Review | A draft pull request from a linked branch is marked ready for review. |
3 | PR Merged | A pull request from a linked branch is merged. |
4 | PR Closed | A 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.
| Field | Type | Required | Description |
|---|---|---|---|
triggers | array | Yes | The full trigger set. Send [] to remove every trigger |
triggers[].lane_id | integer | Yes | A lane of this project |
triggers[].event_types | integer[] | Yes | At 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_typesis rejected. - One event type, one lane. Putting the same event type on two lanes returns
422withEach 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
| Code | Meaning |
|---|---|
200 | Success (retrieve, update, list) |
201 | Created (store) |
204 | No Content (delete) |
422 | Validation 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:usescope 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.
| Section | What's Covered |
|---|---|
| Overview & Setup | OAuth flow, Claude Code and Cursor configuration |
| Issues | Create one or many, update, search, prepare context, pick up, daily snapshot (10 tools) |
| Comments | Add, update, delete with permission model (3 tools) |
| Time Entries | Log, update, delete, query with grouping (4 tools) |
| Token Usage | Record an agent session's token usage per model (1 tool) |
| Epics | Create, update, delete, get with progress, tick and untick wishes (6 tools) |
| Labels | List, create, update, delete labels, and set an issue's labels (5 tools) |
| Sprints | List, create, update, complete, delete, bulk-assign issues (6 tools) |
| Branches | Link and unlink branches with multi-repo disambiguation (2 tools) |
| Resources | 10 read-only resources for projects, issues, lanes, sprints, epics, members, teams, repos |
| Workflows | Multi-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
- MCP Overview & Setup — Connect your AI assistant to kendo
- Quick Start — Using MCP tools with your AI assistant
- Issues API — Full issue endpoint documentation
- GitHub Integration — GitHub-specific API operations