---
title: "Create a task"
method: POST
path: "/tasks"
tags: ["Tasks"]
---

# Create a task

`POST /tasks`

## Request

- Base URL: `https://app.pencil.ink/api/v1`
- URL: `https://app.pencil.ink/api/v1/tasks`
- Auth: HTTP bearer

Requires a `write` key.

## Request body

- TaskCreate
  - `title` string, required
  - `description` string
  - `priority` 'urgent' | 'high' | 'medium' | 'low'
  - `status` 'backlog' | 'inbox' | 'in_progress' | 'blocked' | 'review' | 'done'
  - `baseStatus` 'backlog' | 'todo' | 'in_progress' | 'blocked' | 'verifying' | 'done'
  - `statusId` string: Concrete status id from `GET /task-statuses`.
  - `projectId` string
  - `customerId` string
  - `agentId` string
  - `humanAssigneeId` string: Canonical Pencil user id to set as the human owner.
  - `autoPickupDisabled` boolean: Set true to keep the task manual instead of allowing automatic AI pickup.
  - `dueAt` integer: Epoch ms.
  - `tags` string[]
  - `checklist` TaskChecklistTemplate
    - `subjects` object[]
      - `name` string, required
      - `email` string
    - `steps` object[], required
      - `title` string, required
      - `required` boolean

## Response `201`

A single task.

- object
  - `data` Task
    - `id` string
    - `displayId` string, nullable
    - `title` string
    - `description` string, nullable
    - `status` 'backlog' | 'inbox' | 'in_progress' | 'blocked' | 'review' | 'done'
    - `baseStatus` 'backlog' | 'todo' | 'in_progress' | 'blocked' | 'verifying' | 'done'
    - `statusId` string, nullable
    - `priority` 'urgent' | 'high' | 'medium' | 'low'
    - `taskType` string: Defaults to `task`.
    - `projectId` string, nullable
    - `epicId` string, nullable
    - `phaseId` string, nullable
    - `customerId` string, nullable
    - `agentId` string, nullable
    - `assigneeId` string, nullable
    - `humanAssigneeId` string, nullable: Canonical Pencil user id for the task's human owner. Distinct from agentId.
    - `autoPickupDisabled` boolean: When true, unassigned inbox tasks are kept manual and skipped by automatic AI pickup.
    - `dueAt` integer, nullable: Epoch ms.
    - `tags` string[]
    - `checklistSummary` TaskChecklistSummary
      - `subjectCount` integer
      - `stepCount` integer
      - `total` integer
      - `completed` integer
      - `requiredTotal` integer
      - `requiredCompleted` integer
      - `incompleteRequired` integer
      - `complete` boolean
      - `percent` integer
    - `createdAt` integer: Epoch ms.
    - `updatedAt` integer, nullable: Epoch ms.

## Other responses

- `400`: Malformed request or invalid field (`validation_error`).
- `401`: Missing or invalid API key (`unauthorized`).
- `403`: The key is read-only and may not write (`forbidden`).
- `429`: Rate limit exceeded (`rate_limited`).

---

[API](https://skmtc.dev/pencil/apis/pencil-public-api.md) · [All operations](https://skmtc.dev/pencil/apis/pencil-public-api/llms.txt) · [OpenAPI document](https://skmtc.dev/pencil/apis/pencil-public-api/revisions/2b842698b76d?raw)
