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

MethodPathPurpose
GET/api/v1/projectsPaginated project list
POST/api/v1/projectsCreate 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

MethodPathPurpose
GET/api/v1/issuesList tasks or support tickets
POST/api/v1/issuesCreate 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:

  • page and limit
  • project_id
  • status
  • kind
  • search

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
  }
}