API Reference

Tasks

Manage tasks within projects and task hierarchies.

REST /api/v1API key authentication5 endpoints
GET/api/v1/tasks

List tasks with optional filters

Query schema
const listQuerySchema = z.object({
  projectId: z.string().uuid().optional(),
  parentTaskId: z.string().uuid().optional(),
  search: z.string().optional(),
  limit: z.coerce.number().int().min(1).max(100).default(50),
  offset: z.coerce.number().int().min(0).default(0),
  lifecycleScope: z.enum(['active', 'all']).default('all'),
});
Response200JSON response with data and pagination envelopes.
POST/api/v1/tasks

Create a new task (child of a project or another task)

JSON body schema
const legacyTaskTypeSchema = z.enum(['project', 'admin', 'template', 'phase', 'stage', 'task']);

const createBodySchema = z.object({
  parentTaskId: z.string().uuid(),
  versionId: z.string().uuid(),
  name: z.string().min(1),
  taskTypeId: z.string().uuid().nullable().optional(),
  taskType: legacyTaskTypeSchema.optional(),
  startDate: z.string().optional(),
  endDate: z.string().optional(),
  description: z.string().optional(),
  position: z.number().int().min(0).optional(),
});
Response201JSON response with a data envelope.
DELETE/api/v1/tasks/:id

Delete a task (soft delete)

Path parametersid: string
Response204No response body.
GET/api/v1/tasks/:id

Get a single task

Path parametersid: string
Response200JSON response with a data envelope.
PATCH/api/v1/tasks/:id

Update a task

Path parametersid: string
JSON body schema
const taskStatusSchema = z.enum(['pending', 'in_progress', 'completed', 'blocked', 'cancelled']);

const updateBodySchema = z.object({
  name: z.string().min(1).optional(),
  description: z.string().nullable().optional(),
  startDate: z.string().nullable().optional(),
  endDate: z.string().nullable().optional(),
  status: taskStatusSchema.optional(),
  color: z
    .string()
    .regex(/^#[0-9A-Fa-f]{6}$/, 'Invalid color format')
    .nullable()
    .optional(),
  taskTypeId: z.string().uuid().nullable().optional(),
});
Response200JSON response with a data envelope.