List projects
GET /v1/projects
curl "$API/v1/projects" \
-H "Authorization: Bearer fel_..."const { data } = await fetch(`${API}/v1/projects`, {
headers: { Authorization: `Bearer ${apiKey}` },
}).then((r) => r.json())
console.log(data.projects)import requests
print(requests.get(f"{API}/v1/projects", headers=headers).json())Response 200
{
"ok": true,
"data": {
"projects": [
{
"id": "prj_01HXYZ",
"name": "Website redesign",
"description": "Q3 launch",
"status": "active",
"companyId": "co_01ABC",
"company": { "id": "co_01ABC", "name": "Acme Co" },
"createdAt": "2026-08-01T10:00:00.000Z"
}
]
}
}Create project
POST /v1/projects
curl -X POST "$API/v1/projects" \
-H "Authorization: Bearer fel_..." \
-H "Content-Type: application/json" \
-d '{"name":"Website redesign","description":"Q3 launch"}'const { data } = await fetch(`${API}/v1/projects`, {
method: 'POST',
headers: {
Authorization: `Bearer ${apiKey}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
name: 'Website redesign',
description: 'Q3 launch',
}),
}).then((r) => r.json())
console.log(data.project)import requests
r = requests.post(
f"{API}/v1/projects",
headers=headers,
json={"name": "Website redesign", "description": "Q3 launch"},
)
print(r.json()){
"name": "Website redesign",
"description": "Q3 launch"
}Response 201
{
"ok": true,
"data": {
"project": {
"id": "prj_01HXYZ",
"name": "Website redesign",
"description": "Q3 launch",
"status": "active",
"companyId": null,
"createdAt": "2026-08-08T09:15:00.000Z"
}
}
}List columns
GET /v1/projects/:id/kanban/columns
curl "$API/v1/projects/$PROJECT_ID/kanban/columns" \
-H "Authorization: Bearer fel_..."const { data } = await fetch(
`${API}/v1/projects/${projectId}/kanban/columns`,
{ headers: { Authorization: `Bearer ${apiKey}` } },
).then((r) => r.json())
console.log(data.columns)import requests
print(requests.get(
f"{API}/v1/projects/{project_id}/kanban/columns",
headers=headers,
).json())Response 200
{
"ok": true,
"data": {
"columns": [
{ "id": "col_backlog", "name": "Backlog", "position": 0, "projectId": "prj_01HXYZ" },
{ "id": "col_progress", "name": "In progress", "position": 1, "projectId": "prj_01HXYZ" },
{ "id": "col_review", "name": "Review", "position": 2, "projectId": "prj_01HXYZ" }
]
}
}Create card
POST /v1/projects/:id/kanban/cards
curl -X POST "$API/v1/projects/$PROJECT_ID/kanban/cards" \
-H "Authorization: Bearer fel_..." \
-H "Content-Type: application/json" \
-d '{"columnId":"col_123","title":"Homepage hero","estimateHours":4}'const { data } = await fetch(
`${API}/v1/projects/${projectId}/kanban/cards`,
{
method: 'POST',
headers: {
Authorization: `Bearer ${apiKey}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
columnId: 'col_123',
title: 'Homepage hero',
estimateHours: 4,
}),
},
).then((r) => r.json())
console.log(data.card)import requests
r = requests.post(
f"{API}/v1/projects/{project_id}/kanban/cards",
headers=headers,
json={
"columnId": "col_123",
"title": "Homepage hero",
"estimateHours": 4,
},
)
print(r.json()){
"columnId": "col_123",
"title": "Homepage hero",
"estimateHours": 4
}Response 201
{
"ok": true,
"data": {
"card": {
"id": "card_01HERO",
"projectId": "prj_01HXYZ",
"columnId": "col_123",
"title": "Homepage hero",
"estimateHours": 4,
"position": 0,
"createdAt": "2026-08-08T09:20:00.000Z"
}
}
}Get card
GET /v1/kanban/cards/:cardId
curl "$API/v1/kanban/cards/$CARD_ID" \
-H "Authorization: Bearer fel_..."const { data } = await fetch(
`${API}/v1/kanban/cards/${cardId}`,
{ headers: { Authorization: `Bearer ${apiKey}` } },
).then((r) => r.json())
console.log(data.card)import requests
print(requests.get(
f"{API}/v1/kanban/cards/{card_id}",
headers=headers,
).json())Response 200
{
"ok": true,
"data": {
"card": {
"id": "card_01HERO",
"projectId": "prj_01HXYZ",
"columnId": "col_123",
"title": "Homepage hero",
"description": null,
"estimateHours": 4,
"comments": [],
"attachments": [],
"createdAt": "2026-08-08T09:20:00.000Z",
"updatedAt": "2026-08-08T09:20:00.000Z"
}
}
}Update card
PUT /v1/kanban/cards/:cardId
curl -X PUT "$API/v1/kanban/cards/$CARD_ID" \
-H "Authorization: Bearer fel_..." \
-H "Content-Type: application/json" \
-d '{"title":"Homepage hero v2","columnId":"col_review"}'const { data } = await fetch(
`${API}/v1/kanban/cards/${cardId}`,
{
method: 'PUT',
headers: {
Authorization: `Bearer ${apiKey}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
title: 'Homepage hero v2',
columnId: 'col_review',
}),
},
).then((r) => r.json())
console.log(data.card)import requests
r = requests.put(
f"{API}/v1/kanban/cards/{card_id}",
headers=headers,
json={
"title": "Homepage hero v2",
"columnId": "col_review",
},
)
print(r.json()){
"title": "Homepage hero v2",
"columnId": "col_review"
}Response 200
{
"ok": true,
"data": {
"card": {
"id": "card_01HERO",
"projectId": "prj_01HXYZ",
"columnId": "col_review",
"title": "Homepage hero v2",
"estimateHours": 4,
"updatedAt": "2026-08-08T11:02:00.000Z"
}
}
}Add card comment
POST /v1/kanban/cards/:cardId/comments
curl -X POST "$API/v1/kanban/cards/$CARD_ID/comments" \
-H "Authorization: Bearer fel_..." \
-H "Content-Type: application/json" \
-d '{"body":"Client prefers the wider crop."}'const { data } = await fetch(
`${API}/v1/kanban/cards/${cardId}/comments`,
{
method: 'POST',
headers: {
Authorization: `Bearer ${apiKey}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({ body: 'Client prefers the wider crop.' }),
},
).then((r) => r.json())
console.log(data.comment)import requests
r = requests.post(
f"{API}/v1/kanban/cards/{card_id}/comments",
headers=headers,
json={"body": "Client prefers the wider crop."},
)
print(r.json()){
"body": "Client prefers the wider crop."
}Response 201
{
"ok": true,
"data": {
"comment": {
"id": "cmt_01NOTE",
"cardId": "card_01HERO",
"body": "Client prefers the wider crop.",
"authorId": "acc_01STAFF",
"createdAt": "2026-08-08T11:05:00.000Z"
}
}
}