---
title: "Bulk create and update Tasks"
method: POST
path: "/tasks/bulk"
tags: ["Taskflow"]
---

# Bulk create and update Tasks

`POST /tasks/bulk`

Executes a batch of Task operations (creates and updates) for a single Workflow Process.

**Request Rules:**
- Only `In Progress` or `Not Started` Processes are permitted
- Tasks with an `id` are treated as updates
- Tasks without an `id` (or `id: null`) are treated as creates
- Updates are processed before creates
- New tasks are always created with status `DRAFT` regardless of supplied value
- Only Workflow Managers can access this endpoint

**Resources:**
- Each task supports a `resources` array of `{id, content_type}` objects
- Valid `content_type` values: `dashboard`, `template`, `templateupload`, `canvas`
- Maximum of 1 resource per task
- Omit `resources` to preserve existing; set to `[]` to clear all
- User must have view access to a resource to assign it
- Restricted resources are returned with `permission_denied: true` and `content: {}`

**Response Behavior:**
- Returns 400 for request-level validation errors (invalid `process_id`, missing `tasks`, duplicate task IDs)
- Returns 200 with per-task results for individual task operations (partial success supported)
- Each result has `task` (data or null) and `errors` (null or error details)
- On update failure, `task` contains current state; on create failure, `task` is null

**Per-Task Error Structure (flat array):**
- Each error has: `code`, `detail`, and `source`
- Field errors: `source: { field: "name" }` with DRF codes (`null`, `required`, `invalid`)
- Business errors: `source: null` with custom codes (`INVALID_DATE_PAST_DUE`, `DUPLICATE_NAME`)
- Multiple errors can be present on a single task

## Headers

- `X-Company-ID` string, required

## Request body

- BulkTaskRequest
  - `process_id` integer, required
  - `tasks` BulkTaskItem[], required
    - `id` integer
    - `name` string
    - `description` string
    - `status` 'DRAFT' | 'TODO' | 'DONE' — * `DRAFT` - Draft * `TODO` - To Do * `DONE` - Done
    - `due_date` string, date
    - `assignee_id` integer
    - `resources` Resource[]
      - `id` string, required
      - `permission_denied` boolean, required
      - `content_type` string, required
      - `content` object, required

## Response `200`

- BulkTaskResult[]
  - `task` Task, required
    - `id` integer, required
    - `process_id` integer
    - `name` string, required
    - `description` string
    - `status` 'DRAFT' | 'TODO' | 'DONE' — * `DRAFT` - Draft * `TODO` - To Do * `DONE` - Done
    - `resources` Resource[]
      - `id` string, required
      - `permission_denied` boolean, required
      - `content_type` string, required
      - `content` object, required
    - `assignee_id` string, nullable
    - `due_date` string, date, nullable
    - `deleted_at` string, date-time, nullable, required
    - `completed_at` string, date-time, nullable, required
    - `assigned_at` string, date-time, nullable, required
    - `modified_at` string, date-time, required
    - `completed_by_id` integer, nullable, required
    - `created_by_id` integer, required
    - `modified_by_id` integer, nullable, required
  - `errors` BulkTaskError[], nullable, required
    - `code` string, required — Error code (DRF codes like "null", "invalid" or custom codes like "INVALID_DATE_PAST_DUE")
    - `detail` string, required — Human-readable error message
    - `source` object, nullable, required — Source of the error. Contains {"field": "field_name"} for validation errors, null for business errors.

## Other responses

- `400` — Bad Request - Invalid process_id, missing tasks, or duplicate task IDs
- `401` — Unauthorized
- `403` — Forbidden - User is not a Workflow Manager

---

[API](https://skmtc.net/cubesoftware/apis/cube-api.md) · [All operations](https://skmtc.net/cubesoftware/apis/cube-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/cubesoftware/cube-api/revisions/67d9f45bb99b/schema)
