Projects REST API
Manage projects and project tasks through the Leenops v1 API.
Projects are exposed at /api/v1/projects; project tasks use the historical /api/v1/issues resource name.
export LEENOPS_API_KEY="wks_..."
curl "https://workspace.leenops.com/api/v1/projects?page=1&limit=25" \
-H "Authorization: Bearer $LEENOPS_API_KEY"See Authentication for key creation and JWT support.
Projects
| Method | Path | Purpose |
|---|---|---|
GET | /api/v1/projects | Paginated project list |
POST | /api/v1/projects | Create a project |
GET | /api/v1/projects/{id} | Read a project |
PATCH | /api/v1/projects/{id} | Update a project |
DELETE | /api/v1/projects/{id} | Soft-delete a project |
Create example:
curl -X POST https://workspace.leenops.com/api/v1/projects \
-H "Authorization: Bearer $LEENOPS_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Website redesign",
"description": "Marketing site overhaul",
"status": "active",
"priority": "high",
"start_date": "2026-08-01",
"end_date": "2026-09-30"
}'The strict create schema also accepts progress, team_id, lead_user_id, template_id, deal_id, company_id, github_url, external_id, and hosted. It rejects unknown fields such as target_date.
Project tasks
| Method | Path | Purpose |
|---|---|---|
GET | /api/v1/issues | List tasks or support tickets |
POST | /api/v1/issues | Create a task or ticket |
GET | /api/v1/issues/{id} | Read one item |
PATCH | /api/v1/issues/{id} | Update one item |
DELETE | /api/v1/issues/{id} | Soft-delete a project task only |
Create a task:
curl -X POST https://workspace.leenops.com/api/v1/issues \
-H "Authorization: Bearer $LEENOPS_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"kind": "task",
"project_id": "00000000-0000-0000-0000-000000000000",
"title": "Fix login timeout",
"description": "Users are signed out too early",
"priority": "high",
"due_at": "2026-08-15T17:00:00Z"
}'kind is required and must be task or ticket. The strict create schema also accepts status, assignee_id, parent_id, cycle_id, and estimate_hours; it does not accept a labels array.
Omitting kind from GET /api/v1/issues currently defaults the data source
to project tasks. Use kind=task explicitly in integrations. The DELETE
implementation only deletes project tasks and must not be used for support
tickets.
List filters and pagination
Projects support page and limit. Issues support:
pageandlimitproject_idstatuskindsearch
Parameters such as per_page, sort, order, overdue, and list-level assignee_id are not implemented.
Successful /api/v1 calls use the common response envelope:
{
"data": [],
"pagination": {
"page": 1,
"limit": 25,
"total": 0,
"hasMore": false
}
}
