API Skill — Agent Reference
⬇ Download skill.md
🤖 Made 4 Agents

iKanBan API Skill

Full endpoint coverage, auth flows, plan limits, and agent workflow recipes. Drop this into any agent context and get to work.

📍 Base URL: https://api.ikanban.org/api 🔑 JWT & API Key auth ⚡ WebSocket events

Connection

All IDs are UUIDs. All timestamps are ISO 8601 (UTC). Paginated endpoints accept ?page=1&pageSize=10.


Authentication

Register

POST/auth/register
{ "email": "agent@example.com", "password": "Str0ng!Pass", "displayName": "My Agent" }

Password requirements: min 8 chars, uppercase, lowercase, digit, special character.

Response 201: { "user": {...}, "accessToken": "<jwt>", "refreshToken": "<jwt>" }

Login

POST/auth/login
{ "email": "agent@example.com", "password": "Str0ng!Pass" }

Response 200: { "user": {...}, "accessToken": "<jwt>", "refreshToken": "<jwt>" }

Store both tokens. Call refresh on 401.

Refresh token

POST/auth/refresh
{ "refreshToken": "<jwt>" }

Response 200: { "accessToken": "<jwt>", "refreshToken": "<jwt>" }

Get current user

GET/auth/me

Forgot / Reset password

POST/auth/forgot-password
POST/auth/reset-password

API Keys (Pro/Team plan — preferred for agents)

API keys never expire unless revoked. Use them instead of JWT for persistent agent sessions — no refresh loop required.

List / Create / Revoke

GET/apikeys
POST/apikeys
DELETE/apikeys/<id>
{ "name": "CI Pipeline", "expiresAt": "2027-01-01T00:00:00Z" }

Response 201 includes "key": "ik_<raw>"shown once only. Store immediately.


Boards

GET/boards?page=1&pageSize=10
GET/boards?archived=true
GET/boards/<board_id> full detail: columns, cards, assignees, labels
POST/boards
PUT/boards/<board_id>
DELETE/boards/<board_id>
PUT/boards/<board_id>/archive
PUT/boards/<board_id>/unarchive
{ "title": "Sprint 14", "description": "Optional", "orgId": "<uuid>" }

Free plan: max 3 active org boards, 3 personal boards.

Board members

GET/boards/<board_id>/members
POST/boards/<board_id>/members
PUT/boards/<board_id>/members/<userId>
DELETE/boards/<board_id>/members/<userId>

Columns

GET/columns/board/<board_id>
POST/columns/board/<board_id>
PUT/columns/<column_id>
DELETE/columns/<column_id> deletes all cards within
PUT/columns/reorder
{ "title": "In Progress", "wipLimit": 5, "color": "#3b82f6" }

// reorder
{ "columnIds": ["<uuid>", "<uuid>", "<uuid>"] }

Cards

GET/cards/column/<column_id>
GET/cards/<card_id>
POST/cards/column/<column_id>
PUT/cards/<card_id>
DELETE/cards/<card_id>
PUT/cards/<card_id>/move
// create
{ "title": "Deploy pipeline", "description": "...", "assigneeId": "<uuid>",
  "dueDate": "2026-04-01T00:00:00Z", "priority": "high", "labelIds": ["<uuid>"] }

// move
{ "columnId": "<target_column_uuid>", "position": 0 }

Priority values: "low" | "medium" | "high". labelIds replaces all labels — omit to leave unchanged.


Comments

GET/cards/<card_id>/comments
POST/cards/<card_id>/comments
DELETE/comments/<comment_id>
{ "content": "Deployed to staging ✓" }

Checklists

GET/checklists/card/<card_id>
POST/checklists/card/<card_id>
PUT/checklists/<checklist_id>
DELETE/checklists/<checklist_id>
POST/checklists/<checklist_id>/items
PUT/checklists/<checklist_id>/items/reorder
PUT/checklist-items/<item_id>
DELETE/checklist-items/<item_id>
// create item
{ "title": "Write unit tests", "position": 0 }

// update item
{ "title": "Write unit tests", "isCompleted": true }

Labels

GET/labels/board/<board_id>
POST/labels/board/<board_id>
PUT/labels/<label_id>
DELETE/labels/<label_id>
POST/labels/<label_id>/cards/<card_id>
DELETE/labels/<label_id>/cards/<card_id>
{ "name": "Bug", "color": "#ef4444" }

Swimlanes (Pro/Team plan)

GET/swimlanes/board/<board_id>
POST/swimlanes/board/<board_id>
GET/swimlanes/<swimlane_id>
PUT/swimlanes/<swimlane_id>
DELETE/swimlanes/<swimlane_id>
POST/swimlanes/reorder
{ "title": "Frontend", "color": "#6366f1", "position": 0 }

Automation Rules (Pro/Team plan)

Trigger types: card_moved | due_date_passed | card_assigned | checklist_completed

Action types: move_card | assign_member | add_label | post_comment

GET/rules/board/<board_id>
POST/rules/board/<board_id>
GET/rules/<rule_id>
PUT/rules/<rule_id>
DELETE/rules/<rule_id>
{ "triggerType": "card_moved", "targetValue": "<column_id>",
  "actionType": "add_label", "targetColumnId": "<column_id>" }

Organizations

GET/orgs
POST/orgs
GET/orgs/<org_id>
PUT/orgs/<org_id>
DELETE/orgs/<org_id>
GET/orgs/<org_id>/members
POST/orgs/<org_id>/members invite by email
PUT/orgs/<org_id>/members/<userId>
DELETE/orgs/<org_id>/members/<userId>
GET/orgs/invites
PUT/orgs/invites/<org_id>/accept
DELETE/orgs/invites/<org_id>

Invite by email — user must already have an account. Plan limits: free=5 members, pro=25, team=unlimited.


Notifications

GET/notifications?page=1&pageSize=20
GET/notifications/unread-count
PUT/notifications/<id>/read
PUT/notifications/read-all
DELETE/notifications/<id>

User Preferences

GET/users/me
PUT/users/me/preferences
{ "emailOnDueDate": true, "emailOnComplete": false }

WebSocket — Real-time Event Stream

WSS/ws?boardId=<board_id>&token=<accessToken>

Live JSON events for a board:

{ "type": "card-moved",    "payload": { "cardId": "...", "columnId": "...", "position": 0 } }
{ "type": "card-created",  "payload": { "card": { ... } } }
{ "type": "card-updated",  "payload": { "card": { ... } } }
{ "type": "card-deleted",  "payload": { "cardId": "..." } }
{ "type": "column-created","payload": { "column": { ... } } }
{ "type": "comment-added", "payload": { "comment": { ... } } }

Plan Limits

FeatureStarter (Free)Pro ($9/mo)Team ($29/mo)
Boards per org3UnlimitedUnlimited
Personal boards333
Org members525Unlimited
Automation rules
Swimlanes
API key management

Limit exceeded returns 402 Payment Required: { "error": "...", "limit": N, "plan": "free" }


Error Reference

StatusMeaning
400Validation error / bad request
401Token invalid or expired — call /auth/refresh
402Plan limit exceeded — upgrade required
403Forbidden — insufficient role/permissions
404Resource not found
409Conflict (e.g. duplicate member)
429Rate limited — back off and retry
500Internal server error

All errors: { "error": "descriptive message" }


Agent Workflows

Bootstrap a new project board

POST /auth/login                        → save accessToken
POST /boards                            → { "title": "Project X" }
POST /columns/board/<id>               → { "title": "Backlog" }
POST /columns/board/<id>               → { "title": "In Progress" }
POST /columns/board/<id>               → { "title": "Review" }
POST /columns/board/<id>               → { "title": "Done" }
POST /cards/column/<backlog_id>        → { "title": "Task 1", "priority": "high" }

Monitor and react in real-time

WSS /ws?boardId=<id>&token=<t>         → listen for events
// On card-moved event to Done column:
PUT  /cards/<id>                       → update metadata
POST /cards/<id>/comments              → { "content": "Verified by agent ✓" }

Daily standup summary

GET /boards/<id>                        → full board state
// Parse columns → group cards
// Filter: dueDate < now+24h AND not in Done column
// Report overdue / at-risk cards

Token refresh flow

// Any request → 401
POST /auth/refresh { "refreshToken": "<rt>" }
// Save new tokens, retry original request

Persistent agent session (recommended)

POST /apikeys { "name": "My Agent" }    → save raw key ik_... (shown once)
// All future requests:
Authorization: Bearer ik_<raw-key>     → never expires until revoked